% % The OpenCV cheatsheet structure: % % opencv data structures % point, rect % matrix % % creating matrices % from scratch % from previously allocated data: plain arrays, vectors % converting to/from old-style structures % % element access, iteration through matrix elements % % copying & shuffling matrix data % copying & converting the whole matrices % extracting matrix parts & copying them % split, merge & mixchannels % flip, transpose, repeat % % matrix & image operations: % arithmetics & logic % matrix multiplication, inversion, determinant, trace, SVD % statistical functions % % basic image processing: % image filtering with predefined & custom filters % example: finding local maxima % geometrical transformations, resize, warpaffine, perspective & remap. % color space transformations % histograms & back projections % contours % % i/o: % displaying images % saving/loading to/from file (XML/YAML & image file formats) % reading videos & camera feed, writing videos % % operations on point sets: % findcontours, bounding box, convex hull, min area rect, % transformations, to/from homogeneous coordinates % matching point sets: homography, fundamental matrix, rigid transforms % % 3d: % camera calibration, pose estimation. % uncalibrated case % stereo: rectification, running stereo correspondence, obtaining the depth. % % feature detection: % features2d toolbox % % object detection: % using a classifier running on a sliding window: cascadeclassifier + hog. % using salient point features: features2d -> matching % % statistical data processing: % clustering (k-means), % classification + regression (SVM, boosting, k-nearest), % compressing data (PCA) % \documentclass[10pt,landscape]{article} \usepackage[usenames,dvips,pdftex]{color} \usepackage{multicol} \usepackage{calc} \usepackage{ifthen} \usepackage[pdftex]{color,graphicx} \usepackage[landscape]{geometry} \usepackage{hyperref} \hypersetup{colorlinks=true, filecolor=black, linkcolor=black, urlcolor=blue, citecolor=black} \graphicspath{{./images/}} % This sets page margins to .5 inch if using letter paper, and to 1cm % if using A4 paper. (This probably isn't strictly necessary.) % If using another size paper, use default 1cm margins. \ifthenelse{\lengthtest { \paperwidth = 11in}} { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } } % Turn off header and footer % \pagestyle{empty} % Redefine section commands to use less space \makeatletter \renewcommand{\section}{\@startsection{section}{1}{0mm}% {-1ex plus -.5ex minus -.2ex}% {0.5ex plus .2ex}%x {\normalfont\large\bfseries}} \renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% {-1explus -.5ex minus -.2ex}% {0.5ex plus .2ex}% {\normalfont\normalsize\bfseries}} \renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% {-1ex plus -.5ex minus -.2ex}% {1ex plus .2ex}% {\normalfont\small\bfseries}} \makeatother % Define BibTeX command \def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} % Don't print section numbers \setcounter{secnumdepth}{0} %\setlength{\parindent}{0pt} %\setlength{\parskip}{0pt plus 0.5ex} \newcommand{\ccode}[1]{ \begin{alltt} #1 \end{alltt} } % ----------------------------------------------------------------------- \begin{document} \raggedright \footnotesize \begin{multicols}{3} % multicol parameters % These lengths are set only within the two main columns %\setlength{\columnseprule}{0.25pt} \setlength{\premulticols}{1pt} \setlength{\postmulticols}{1pt} \setlength{\multicolsep}{1pt} \setlength{\columnsep}{2pt} \begin{center} \Large{\textbf{OpenCV 2.2 Cheat Sheet (C++)}} \\ \end{center} \newlength{\MyLen} \settowidth{\MyLen}{\texttt{letterpaper}/\texttt{a4paper} \ } %\section{Filesystem Concepts} %\begin{tabular}{@{}p{\the\MyLen}% % @{}p{\linewidth-\the\MyLen}@{}} %\texttt{\href{http://www.ros.org/wiki/Packages}{package}} & The lowest level of ROS software organization. \\ %\texttt{\href{http://www.ros.org/wiki/Manifest}{manifest}} & Description of a ROS package. \\ %\texttt{\href{http://www.ros.org/wiki/Stack}{stack}} & Collections of ROS packages that form a higher-level library. \\ %\texttt{\href{http://www.ros.org/wiki/Stack Manifest}{stack manifest}} & Description of a ROS stack. %\end{tabular} \emph{The OpenCV C++ reference manual is here: \url{http://opencv.willowgarage.com/documentation/cpp/}. Use \textbf{Quick Search} to find descriptions of the particular functions and classes} \section{Key OpenCV Classes} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#point}{Point\_}} & Template 2D point class \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#point3}{Point3\_}} & Template 3D point class \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#size}{Size\_}} & Template size (width, height) class \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#vec}{Vec}} & Template short vector class \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#vec}{Matx}} & Template small matrix class \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#scalar}{Scalar}} & 4-element vector \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#rect}{Rect}} & Rectangle \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#range}{Range}} & Integer value range \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#mat}{Mat}} & 2D or multi-dimensional dense array (can be used to store matrices, images, histograms, feature descriptors, voxel volumes etc.)\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#sparsemat}{SparseMat}} & Multi-dimensional sparse array \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#ptr}{Ptr}} & Template smart pointer class \end{tabular} \section{Matrix Basics} \begin{tabbing} \textbf{Cr}\=\textbf{ea}\=\textbf{te}\={} \textbf{a matrix} \\ \> \texttt{Mat image(240, 320, CV\_8UC3);} \\ \textbf{[Re]allocate a pre-declared matrix}\\ \> \texttt{image.\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::create}{create}(480, 640, CV\_8UC3);}\\ \textbf{Create a matrix initialized with a constant}\\ \> \texttt{Mat A33(3, 3, CV\_32F, Scalar(5));} \\ \> \texttt{Mat B33(3, 3, CV\_32F); B33 = Scalar(5);} \\ \> \texttt{Mat C33 = Mat::ones(3, 3, CV\_32F)*5.;} \\ \> \texttt{Mat D33 = Mat::zeros(3, 3, CV\_32F) + 5.;} \\ \textbf{Create a matrix initialized with specified values}\\ \> \texttt{double a = CV\_PI/3;} \\ \> \texttt{Mat A22 = (Mat\_(2, 2) <<} \\ \> \> \texttt{cos(a), -sin(a), sin(a), cos(a));} \\ \> \texttt{float B22data[] = \{cos(a), -sin(a), sin(a), cos(a)\};} \\ \> \texttt{Mat B22 = Mat(2, 2, CV\_32F, B22data).clone();}\\ \textbf{Initialize a random matrix}\\ \> \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-randu}{randu}(image, Scalar(0), Scalar(256)); }\textit{// uniform dist}\\ \> \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-randn}{randn}(image, Scalar(128), Scalar(10)); }\textit{// Gaussian dist}\\ \textbf{Convert matrix to/from other structures}\\ \>\textbf{(without copying the data)}\\ \> \texttt{Mat image\_alias = image;}\\ \> \texttt{float* Idata=new float[480*640*3];}\\ \> \texttt{Mat I(480, 640, CV\_32FC3, Idata);}\\ \> \texttt{vector iptvec(10);}\\ \> \texttt{Mat iP(iptvec); }\textit{// iP -- 10x1 CV\_32SC2 matrix}\\ \> \texttt{IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);}\\ \> \texttt{Mat newC = cvarrToMat(oldC0);}\\ \> \texttt{IplImage oldC1 = newC; CvMat oldC2 = newC;}\\ \textbf{... (with copying the data)}\\ \> \texttt{Mat newC2 = cvarrToMat(oldC0).clone();}\\ \> \texttt{vector ptvec = Mat\_(iP);}\\ \>\\ \textbf{Access matrix elements}\\ \> \texttt{A33.at(i,j) = A33.at(j,i)+1;}\\ \> \texttt{Mat dyImage(image.size(), image.type());}\\ \> \texttt{for(int y = 1; y < image.rows-1; y++) \{}\\ \> \> \texttt{Vec3b* prevRow = image.ptr(y-1);}\\ \> \> \texttt{Vec3b* nextRow = image.ptr(y+1);}\\ \> \> \texttt{for(int x = 0; y < image.cols; x++)}\\ \> \> \> \texttt{for(int c = 0; c < 3; c++)}\\ \> \> \> \texttt{ dyImage.at(y,x)[c] =}\\ \> \> \> \texttt{ saturate\_cast(}\\ \> \> \> \texttt{ nextRow[x][c] - prevRow[x][c]);}\\ \> \texttt{\} }\\ \> \texttt{Mat\_::iterator it = image.begin(),}\\ \> \> \texttt{itEnd = image.end();}\\ \> \texttt{for(; it != itEnd; ++it)}\\ \> \> \texttt{(*it)[1] \textasciicircum{}= 255;}\\ \end{tabbing} \section{Matrix Manipulations: Copying, Shuffling, Part Access} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::copyTo}{src.copyTo(dst)}} & Copy matrix to another one \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::convertTo}{src.convertTo(dst,type,scale,shift)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Scale and convert to another datatype \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::clone}{m.clone()}} & Make deep copy of a matrix \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::reshape}{m.reshape(nch,nrows)}} & Change matrix dimensions and/or number of channels without copying data \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::row}{m.row(i)}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::col}{m.col(i)}} & Take a matrix row/column \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::rowRange}{m.rowRange(Range(i1,i2))}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::colRange}{m.colRange(Range(j1,j2))}} & \ \ \ \ \ \ \ Take a matrix row/column span \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::diag}{m.diag(i)}} & Take a matrix diagonal \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#index-1245}{m(Range(i1,i2),Range(j1,j2)), m(roi)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ Take a submatrix \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html\#Mat::repeat}{m.repeat(ny,nx)}} & Make a bigger matrix from a smaller one \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-flip}{flip(src,dst,dir)}} & Reverse the order of matrix rows and/or columns \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-split}{split(...)}} & Split multi-channel matrix into separate channels \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-merge}{merge(...)}} & Make a multi-channel matrix out of the separate channels \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-mixchannels}{mixChannels(...)}} & Generalized form of split() and merge() \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-randshuffle}{randShuffle(...)}} & Randomly shuffle matrix elements \\ \end{tabular} \begin{tabbing} Exa\=mple 1. Smooth image ROI in-place\\ \>\texttt{Mat imgroi = image(Rect(10, 20, 100, 100));}\\ \>\texttt{GaussianBlur(imgroi, imgroi, Size(5, 5), 1.2, 1.2);}\\ Example 2. Somewhere in a linear algebra algorithm \\ \>\texttt{m.row(i) += m.row(j)*alpha;}\\ Example 3. Copy image ROI to another image with conversion\\ \>\texttt{Rect r(1, 1, 10, 20);}\\ \>\texttt{Mat dstroi = dst(Rect(0,10,r.width,r.height));}\\ \>\texttt{src(r).convertTo(dstroi, dstroi.type(), 1, 0);}\\ \end{tabbing} \section{Simple Matrix Operations} OpenCV implements most common arithmetical, logical and other matrix operations, such as \begin{itemize} \item \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-add}{add()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-subtract}{subtract()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-multiply}{multiply()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-divide}{divide()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-absdiff}{absdiff()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#bitwise-and}{bitwise\_and()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#bitwise-or}{bitwise\_or()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#bitwise-xor}{bitwise\_xor()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-max}{max()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-min}{min()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-compare}{compare()}} -- correspondingly, addition, subtraction, element-wise multiplication ... comparison of two matrices or a matrix and a scalar. \begin{tabbing} Exa\=mple. \href{http://en.wikipedia.org/wiki/Alpha_compositing}{Alpha compositing} function:\\ \texttt{void alphaCompose(const Mat\& rgba1,}\\ \> \texttt{const Mat\& rgba2, Mat\& rgba\_dest)}\\ \texttt{\{ }\\ \> \texttt{Mat a1(rgba1.size(), rgba1.type()), ra1;}\\ \> \texttt{Mat a2(rgba2.size(), rgba2.type());}\\ \> \texttt{int mixch[]=\{3, 0, 3, 1, 3, 2, 3, 3\};}\\ \> \texttt{mixChannels(\&rgba1, 1, \&a1, 1, mixch, 4);}\\ \> \texttt{mixChannels(\&rgba2, 1, \&a2, 1, mixch, 4);}\\ \> \texttt{subtract(Scalar::all(255), a1, ra1);}\\ \> \texttt{bitwise\_or(a1, Scalar(0,0,0,255), a1);}\\ \> \texttt{bitwise\_or(a2, Scalar(0,0,0,255), a2);}\\ \> \texttt{multiply(a2, ra1, a2, 1./255);}\\ \> \texttt{multiply(a1, rgba1, a1, 1./255);}\\ \> \texttt{multiply(a2, rgba2, a2, 1./255);}\\ \> \texttt{add(a1, a2, rgba\_dest);}\\ \texttt{\}} \end{tabbing} \item \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-sum}{sum()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-mean}{mean()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-mean-stddev}{meanStdDev()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-norm}{norm()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-countnonzero}{countNonZero()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-minmaxloc}{minMaxLoc()}}, -- various statistics of matrix elements. \item \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-exp}{exp()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-log}{log()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-pow}{pow()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-sqrt}{sqrt()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-carttopolar}{cartToPolar()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-polarToCart}{polarToCart()}} -- the classical math functions. \item \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-scaleadd}{scaleAdd()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-transpose}{transpose()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-gemm}{gemm()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-invert}{invert()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-solve}{solve()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-determinant}{determinant()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-trace}{trace()}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-eigen}{eigen()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-SVD}{SVD}}, -- the algebraic functions + SVD class. \item \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-dft}{dft()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-idft}{idft()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-dct}{dct()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html\#cv-idct}{idct()}}, -- discrete Fourier and cosine transformations \end{itemize} For some operations a more convenient \href{http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html#matrix-expressions}{algebraic notation} can be used, for example: \begin{tabbing} \texttt{Mat}\={} \texttt{delta = (J.t()*J + lambda*}\\ \>\texttt{Mat::eye(J.cols, J.cols, J.type()))}\\ \>\texttt{.inv(CV\_SVD)*(J.t()*err);} \end{tabbing} implements the core of Levenberg-Marquardt optimization algorithm. \section{Image Processsing} \subsection{Filtering} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-filter2d}{filter2D()}} & Non-separable linear filter \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-sepfilter2d}{sepFilter2D()}} & Separable linear filter \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-blur}{boxFilter()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-gaussianblur}{GaussianBlur()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-medianblur}{medianBlur()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-bilateralfilter}{bilateralFilter()}} & Smooth the image with one of the linear or non-linear filters \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-sobel}{Sobel()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-scharr}{Scharr()}} & Compute the spatial image derivatives \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-laplacian}{Laplacian()}} & compute Laplacian: $\Delta I = \frac{\partial ^ 2 I}{\partial x^2} + \frac{\partial ^ 2 I}{\partial y^2}$ \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-erode}{erode()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html\#cv-dilate}{dilate()}} & Erode or dilate the image \\ \end{tabular} \begin{tabbing} Exa\=mple. Filter image in-place with a 3x3 high-pass kernel\\ \> (preserve negative responses by shifting the result by 128):\\ \texttt{filter2D(image, image, image.depth(), (Mat\_(3,3)<<}\\ \> \texttt{-1, -1, -1, -1, 9, -1, -1, -1, -1), Point(1,1), 128);}\\ \end{tabbing} \subsection{Geometrical Transformations} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html\#cv-resize}{resize()}} & Resize image \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html\#cv-getrectsubpix}{getRectSubPix()}} & Extract an image patch \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html\#cv-warpaffine}{warpAffine()}} & Warp image affinely\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html\#cv-warpperspective}{warpPerspective()}} & Warp image perspectively\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html\#cv-remap}{remap()}} & Generic image warping\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html\#cv-convertmaps}{convertMaps()}} & Optimize maps for a faster remap() execution\\ \end{tabular} \begin{tabbing} Example. Decimate image by factor of $\sqrt{2}$:\\ \texttt{Mat dst; resize(src, dst, Size(), 1./sqrt(2), 1./sqrt(2));} \end{tabbing} \subsection{Various Image Transformations} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#cvtColor}{cvtColor()}} & Convert image from one color space to another \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#threshold}{threshold()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#adaptivethreshold}{adaptivethreshold()}} & Convert grayscale image to binary image using a fixed or a variable threshold \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#floodfill}{floodFill()}} & Find a connected component using region growing algorithm\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#floodfill}{integral()}} & Compute integral image \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#distancetransform}{distanceTransform()}} & build distance map or discrete Voronoi diagram for a binary image. \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#floodfill}{watershed()}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html\#grabcut}{grabCut()}} & marker-based image segmentation algorithms. See the samples \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/watershed.cpp}{watershed.cpp}} and \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/grabcut.cpp}{grabcut.cpp}}. \end{tabular} \subsection{Histograms} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_histograms.html\#calchist}{calcHist()}} & Compute image(s) histogram \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_histograms.html\#calcbackproject}{calcBackProject()}} & Back-project the histogram \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_histograms.html\#equalizehist}{equalizeHist()}} & Normalize image brightness and contrast\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/imgproc_histograms.html\#comparehist}{compareHist()}} & Compare two histograms\\ \end{tabular} \begin{tabbing} Example. Compute Hue-Saturation histogram of an image:\\ \texttt{Mat hsv, H; MatND tempH;}\\ \texttt{cvtColor(image, hsv, CV\_BGR2HSV);}\\ \texttt{int planes[]=\{0, 1\}, hsize[] = \{32, 32\};}\\ \texttt{calcHist(\&hsv, 1, planes, Mat(), tempH, 2, hsize, 0);}\\ \texttt{H = tempH;} \end{tabbing} \subsection{Contours} See \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/contours.cpp}{contours.cpp}} and \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/squares.cpp}{squares.cpp}} samples on what are the contours and how to use them. \section{Data I/O} \href{http://opencv.willowgarage.com/documentation/cpp/core_xml_yaml_persistence.html\#filestorage}{XML/YAML storages} are collections (possibly nested) of scalar values, structures and heterogeneous lists. \begin{tabbing} \textbf{Wr}\=\textbf{iting data to YAML (or XML)}\\ \texttt{// Type of the file is determined from the extension}\\ \texttt{FileStorage fs("test.yml", FileStorage::WRITE);}\\ \texttt{fs << "i" << 5 << "r" << 3.1 << "str" << "ABCDEFGH";}\\ \texttt{fs << "mtx" << Mat::eye(3,3,CV\_32F);}\\ \texttt{fs << "mylist" << "[" << CV\_PI << "1+1" <<}\\ \>\texttt{"\{:" << "month" << 12 << "day" << 31 << "year"}\\ \>\texttt{<< 1969 << "\}" << "]";}\\ \texttt{fs << "mystruct" << "\{" << "x" << 1 << "y" << 2 <<}\\ \>\texttt{"width" << 100 << "height" << 200 << "lbp" << "[:";}\\ \texttt{const uchar arr[] = \{0, 1, 1, 0, 1, 1, 0, 1\};}\\ \texttt{fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));}\\ \texttt{fs << "]" << "\}";} \end{tabbing} \emph{Scalars (integers, floating-point numbers, text strings), matrices, STL vectors of scalars and some other types can be written to the file storages using \texttt{<<} operator} \begin{tabbing} \textbf{Re}\=\textbf{ading the data back}\\ \texttt{// Type of the file is determined from the content}\\ \texttt{FileStorage fs("test.yml", FileStorage::READ);}\\ \texttt{int i1 = (int)fs["i"]; double r1 = (double)fs["r"];}\\ \texttt{string str1 = (string)fs["str"];}\\ \texttt{Mat M; fs["mtx"] >> M;}\\ \texttt{FileNode tl = fs["mylist"];}\\ \texttt{CV\_Assert(tl.type() == FileNode::SEQ \&\& tl.size() == 3);}\\ \texttt{double tl0 = (double)tl[0]; string tl1 = (string)tl[1];}\\ \texttt{int m = (int)tl[2]["month"], d = (int)tl[2]["day"];}\\ \texttt{int year = (int)tl[2]["year"];}\\ \texttt{FileNode tm = fs["mystruct"];}\\ \texttt{Rect r; r.x = (int)tm["x"], r.y = (int)tm["y"];}\\ \texttt{r.width = (int)tm["width"], r.height = (int)tm["height"];}\\ \texttt{int lbp\_val = 0;}\\ \texttt{FileNodeIterator it = tm["lbp"].begin();}\\ \texttt{for(int k = 0; k < 8; k++, ++it)}\\ \>\texttt{lbp\_val |= ((int)*it) << k;}\\ \end{tabbing} \emph{Scalars are read using the corresponding FileNode's cast operators. Matrices and some other types are read using \texttt{>>} operator. Lists can be read using FileNodeIterator's.} \begin{tabbing} \textbf{Wr}\=\textbf{iting and reading raster images}\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_reading_and_writing_images_and_video.html\#cv-imwrite}{imwrite}{imwrite}("myimage.jpg", image);}\\ \texttt{Mat image\_color\_copy = \href{http://opencv.willowgarage.com/documentation/cpp/highgui_reading_and_writing_images_and_video.html\#cv-imread}{imread}("myimage.jpg", 1);}\\ \texttt{Mat image\_grayscale\_copy = \href{http://opencv.willowgarage.com/documentation/cpp/highgui_reading_and_writing_images_and_video.html\#cv-imread}{imread}("myimage.jpg", 0);}\\ \end{tabbing} \emph{The functions can read/write images in the following formats: \textbf{BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/PGM/PPM (.p?m), Sun Raster (.sr), JPEG 2000 (.jp2)}. Every format supports 8-bit, 1- or 3-channel images. Some formats (PNG, JPEG 2000) support 16 bits per channel.} \begin{tabbing} \textbf{Re}\=\textbf{ading video from a file or from a camera}\\ \texttt{VideoCapture cap;}\\ \texttt{if(argc > 1) cap.open(string(argv[1])); else cap.open(0)};\\ \texttt{Mat frame; namedWindow("video", 1);}\\ \texttt{for(;;) \{}\\ \>\texttt{cap >> frame; if(!frame.data) break;}\\ \>\texttt{imshow("video", frame); if(waitKey(30) >= 0) break;}\\ \texttt{\} } \end{tabbing} \section{Simple GUI (highgui module)} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_user_interface.html\#cv-namedwindow}{namedWindow(winname,flags)}} & \ \ \ \ \ \ \ \ \ \ Create named highgui window \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_user_interface.html\#cv-destroywindow}{destroyWindow(winname)}} & \ \ \ Destroy the specified window \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_user_interface.html\#cv-imshow}{imshow(winname, mtx)}} & Show image in the window \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_user_interface.html\#cv-waitKey}{waitKey(delay)}} & Wait for a key press during the specified time interval (or forever). Process events while waiting. \emph{Do not forget to call this function several times a second in your code.} \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_user_interface.html\#cv-createTrackbar}{createTrackbar(...)}} & Add trackbar (slider) to the specified window \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/highgui_user_interface.html\#cv-setmousecallback}{setMouseCallback(...)}} & \ \ Set the callback on mouse clicks and movements in the specified window \\ \end{tabular} See \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/camshiftdemo.cpp}{camshiftdemo.cpp}} and other \href{https://code.ros.org/svn/opencv/trunk/opencv/samples/}{OpenCV samples} on how to use the GUI functions. \section{Camera Calibration, Pose Estimation and Depth Estimation} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-calibratecamera}{calibrateCamera()}} & Calibrate camera from several views of a calibration pattern. \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-findchessboardcorners}{findChessboardCorners()}} & \ \ \ \ \ \ Find feature points on the checkerboard calibration pattern. \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-solvepnp}{solvePnP()}} & Find the object pose from the known projections of its feature points. \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-stereocalibrate}{stereoCalibrate()}} & Calibrate stereo camera. \\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-stereorectify}{stereoRectify()}} & Compute the rectification transforms for a calibrated stereo camera.\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-initundistortrectifymap}{initUndistortRectifyMap()}} & \ \ \ \ \ \ Compute rectification map (for \texttt{remap()}) for each stereo camera head.\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-StereoBM}{StereoBM}}, \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-StereoSGBM}{StereoSGBM}} & The stereo correspondence engines to be run on rectified stereo pairs.\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-reprojectimageto3d}{reprojectImageTo3D()}} & Convert disparity map to 3D point cloud.\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html\#cv-findhomography}{findHomography()}} & Find best-fit perspective transformation between two 2D point sets. \\ \end{tabular} To calibrate a camera, you can use \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/calibration.cpp}{calibration.cpp}} or \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/stereo\_calib.cpp}{stereo\_calib.cpp}} samples. To get the disparity maps and the point clouds, use \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/stereo\_match.cpp}{stereo\_match.cpp}} sample. \section{Object Detection} \begin{tabular}{@{}p{\the\MyLen}% @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/objdetect__object_detection.html\#matchTemplate}{matchTemplate}} & Compute proximity map for given template.\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/objdetect__object_detection.html\#CascadeClassifier}{CascadeClassifier}} & Viola's Cascade of Boosted classifiers using Haar or LBP features. Suits for detecting faces, facial features and some other objects without diverse textures. See \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/facedetect.cpp}{facedetect.cpp}}\\ \texttt{\href{http://opencv.willowgarage.com/documentation/cpp/objdetect__object_detection.html\#HOGDescriptor}{HOGDescriptor}} & N. Dalal's object detector using Histogram-of-Oriented-Gradients (HOG) features. Suits for detecting people, cars and other objects with well-defined silhouettes. See \texttt{\href{https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/peopledetect.cpp}{peopledetect.cpp}}\\ \end{tabular} % % feature detection: % features2d toolbox % % object detection: % using a classifier running on a sliding window: cascadeclassifier + hog. % using salient point features: features2d -> matching % % statistical data processing: % clustering (k-means), % classification + regression (SVM, boosting, k-nearest), % compressing data (PCA) \end{multicols} \end{document}