%
% 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.4 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.itseez.com} . 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.itseez.com/modules/core/doc/basic_ structures.html\# Point_ } { Point\_ } } & Template 2D point class \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Point3_ } { Point3\_ } } & Template 3D point class \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Size_ } { Size\_ } } & Template size (width, height) class \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Vec} { Vec} } & Template short vector class \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Matx} { Matx} } & Template small matrix class \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Scalar_ } { Scalar} } & 4-element vector \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Rect_ } { Rect} } & Rectangle \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Range} { Range} } & Integer value range \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/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.itseez.com/modules/core/doc/basic_ structures.html\# sparsemat} { SparseMat} } & Multi-dimensional sparse array \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/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.itseez.com/modules/core/doc/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\_ <float>(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.itseez.com/modules/core/doc/operations_ on_ arrays.html\# randu} { randu} (image, Scalar(0), Scalar(256)); } \textit { // uniform dist} \\
\> \texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# 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<Point> 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<Point2f> ptvec = Mat\_ <Point2f>(iP);} \\
\> \\
\textbf { Access matrix elements} \\
\> \texttt { A33.at<float>(i,j) = A33.at<float>(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<Vec3b>(y-1);} \\
\> \> \texttt { Vec3b* nextRow = image.ptr<Vec3b>(y+1);} \\
\> \> \texttt { for(int x = 0; y < image.cols; x++)} \\
\> \> \> \texttt { for(int c = 0; c < 3; c++)} \\
\> \> \> \texttt { dyImage.at<Vec3b>(y,x)[c] =} \\
\> \> \> \texttt { saturate\_ cast<uchar>(} \\
\> \> \> \texttt { nextRow[x][c] - prevRow[x][c]);} \\
\> \texttt { \} } \\
\> \texttt { Mat\_ <Vec3b>::iterator it = image.begin<Vec3b>(),} \\
\> \> \texttt { itEnd = image.end<Vec3b>();} \\
\> \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.itseez.com/modules/core/doc/basic_ structures.html\# mat-copyto} { src.copyTo(dst)} } & Copy matrix to another one \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-convertto} { src.convertTo(dst,type,scale,shift)} } & \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Scale and convert to another datatype \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-clone} { m.clone()} } & Make deep copy of a matrix \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-reshape} { m.reshape(nch,nrows)} } & Change matrix dimensions and/or number of channels without copying data \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-row} { m.row(i)} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-col} { m.col(i)} } & Take a matrix row/column \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-rowrange} { m.rowRange(Range(i1,i2))} }
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-colrange} { m.colRange(Range(j1,j2))} } & \ \ \ \ \ \ \ Take a matrix row/column span \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# mat-diag} { m.diag(i)} } & Take a matrix diagonal \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/basic_ structures.html\# Mat} { m(Range(i1,i2),Range(j1,j2)), m(roi)} } & \ \ \ \ \ \ \ \ \ \ \ \ \ Take a submatrix \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# repeat} { m.repeat(ny,nx)} } & Make a bigger matrix from a smaller one \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# flip} { flip(src,dst,dir)} } & Reverse the order of matrix rows and/or columns \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# split} { split(...)} } & Split multi-channel matrix into separate channels \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# merge} { merge(...)} } & Make a multi-channel matrix out of the separate channels \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# mixchannels} { mixChannels(...)} } & Generalized form of split() and merge() \\
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# 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.itseez.com/modules/core/doc/operations_ on_ arrays.html\# add} { add()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# subtract} { subtract()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# multiply} { multiply()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# divide} { divide()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# absdiff} { absdiff()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# bitwise-and} { bitwise\_ and()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# bitwise-or} { bitwise\_ or()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# bitwise-xor} { bitwise\_ xor()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# max} { max()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# min} { min()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# 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.itseez.com/modules/core/doc/operations_ on_ arrays.html\# sum} { sum()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# mean} { mean()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# meanstddev} { meanStdDev()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# norm} { norm()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# countnonzero} { countNonZero()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# minmaxloc} { minMaxLoc()} } ,
-- various statistics of matrix elements.
\item
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# exp} { exp()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# log} { log()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# pow} { pow()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# sqrt} { sqrt()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# carttopolar} { cartToPolar()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# polartocart} { polarToCart()} }
-- the classical math functions.
\item
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# scaleadd} { scaleAdd()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# transpose} { transpose()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# gemm} { gemm()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# invert} { invert()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# solve} { solve()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# determinant} { determinant()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# trace} { trace()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# eigen} { eigen()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# SVD} { SVD} } ,
-- the algebraic functions + SVD class.
\item
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# dft} { dft()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# idft} { idft()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# dct} { dct()} } ,
\texttt { \href { http://opencv.itseez.com/modules/core/doc/operations_ on_ arrays.html\# idct} { idct()} } ,
-- discrete Fourier and cosine transformations
\end { itemize}
For some operations a more convenient \href { http://opencv.itseez.com/modules/core/doc/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.itseez.com/modules/imgproc/doc/filtering.html\# filter2d} { filter2D()} } & Non-separable linear filter \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# sepfilter2d} { sepFilter2D()} } & Separable linear filter \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# blur} { boxFilter()} } , \texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# gaussianblur} { GaussianBlur()} } ,
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# medianblur} { medianBlur()} } ,
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# bilateralfilter} { bilateralFilter()} }
& Smooth the image with one of the linear or non-linear filters \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# sobel} { Sobel()} } , \texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# scharr} { Scharr()} }
& Compute the spatial image derivatives \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# laplacian} { Laplacian()} } & compute Laplacian: $ \Delta I = \frac { \partial ^ 2 I } { \partial x ^ 2 } + \frac { \partial ^ 2 I } { \partial y ^ 2 } $ \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# erode} { erode()} } , \texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/filtering.html\# dilate} { dilate()} } & Morphological operations \\
\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\_ <float>(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.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# resize} { resize()} } & Resize image \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# getrectsubpix} { getRectSubPix()} } & Extract an image patch \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# warpaffine} { warpAffine()} } & Warp image affinely\\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# warpperspective} { warpPerspective()} } & Warp image perspectively\\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# remap} { remap()} } & Generic image warping\\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# 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.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# cvtcolor} { cvtColor()} } & Convert image from one color space to another \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# threshold} { threshold()} } , \texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# adaptivethreshold} { adaptivethreshold()} } & Convert grayscale image to binary image using a fixed or a variable threshold \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# floodfill} { floodFill()} } & Find a connected component using region growing algorithm\\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# integral} { integral()} } & Compute integral image \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# distancetransform} { distanceTransform()} }
& build distance map or discrete Voronoi diagram for a binary image. \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# watershed} { watershed()} } ,
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_ transformations.html\# grabcut} { grabCut()} }
& marker-based image segmentation algorithms.
See the samples \texttt { \href { http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/watershed.cpp} { watershed.cpp} } and \texttt { \href { http://code.opencv.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.itseez.com/modules/imgproc/doc/histograms.html\# calchist} { calcHist()} } & Compute image(s) histogram \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/histograms.html\# calcbackproject} { calcBackProject()} } & Back-project the histogram \\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/histograms.html\# equalizehist} { equalizeHist()} } & Normalize image brightness and contrast\\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/histograms.html\# comparehist} { compareHist()} } & Compare two histograms\\
\end { tabular}
\begin { tabbing}
Example. Compute Hue-Saturation histogram of an image:\\
\texttt { Mat hsv, H;} \\
\texttt { cvtColor(image, hsv, CV\_ BGR2HSV);} \\
\texttt { int planes[]=\{ 0, 1\} , hsize[] = \{ 32, 32\} ;} \\
\texttt { calcHist(\& hsv, 1, planes, Mat(), H, 2, hsize, 0);} \\
\end { tabbing}
\subsection { Contours}
See \texttt { \href { http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/contours2.cpp} { contours2.cpp} } and \texttt { \href { http://code.opencv.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.itseez.com/modules/core/doc/xml_ yaml_ persistence.html\# xml-yaml-file-storages-writing-to-a-file-storage} { 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.itseez.com/modules/highgui/doc/reading_ and_ writing_ images_ and_ video.html\# imwrite} { imwrite} ("myimage.jpg", image);} \\
\texttt { Mat image\_ color\_ copy = \href { http://opencv.itseez.com/modules/highgui/doc/reading_ and_ writing_ images_ and_ video.html\# imread} { imread} ("myimage.jpg", 1);} \\
\texttt { Mat image\_ grayscale\_ copy = \href { http://opencv.itseez.com/modules/highgui/doc/reading_ and_ writing_ images_ and_ video.html\# 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.itseez.com/modules/highgui/doc/user_ interface.html\# namedwindow} { namedWindow(winname,flags)} } & \ \ \ \ \ \ \ \ \ \ Create named highgui window \\
\texttt { \href { http://opencv.itseez.com/modules/highgui/doc/user_ interface.html\# destroywindow} { destroyWindow(winname)} } & \ \ \ Destroy the specified window \\
\texttt { \href { http://opencv.itseez.com/modules/highgui/doc/user_ interface.html\# imshow} { imshow(winname, mtx)} } & Show image in the window \\
\texttt { \href { http://opencv.itseez.com/modules/highgui/doc/user_ interface.html\# 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.itseez.com/modules/highgui/doc/user_ interface.html\# createtrackbar} { createTrackbar(...)} } & Add trackbar (slider) to the specified window \\
\texttt { \href { http://opencv.itseez.com/modules/highgui/doc/user_ interface.html\# setmousecallback} { setMouseCallback(...)} } & \ \ Set the callback on mouse clicks and movements in the specified window \\
\end { tabular}
See \texttt { \href { http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/camshiftdemo.cpp} { camshiftdemo.cpp} } and other \href { http://code.opencv.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.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# calibratecamera} { calibrateCamera()} } & Calibrate camera from several views of a calibration pattern. \\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# findchessboardcorners} { findChessboardCorners()} } & \ \ \ \ \ \ Find feature points on the checkerboard calibration pattern. \\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# solvepnp} { solvePnP()} } & Find the object pose from the known projections of its feature points. \\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# stereocalibrate} { stereoCalibrate()} } & Calibrate stereo camera. \\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# stereorectify} { stereoRectify()} } & Compute the rectification transforms for a calibrated stereo camera.\\
\texttt { \href { http://opencv.itseez.com/modules/imgproc/doc/geometric_ transformations.html\# initundistortrectifymap} { initUndistortRectifyMap()} } & \ \ \ \ \ \ Compute rectification map (for \texttt { remap()} ) for each stereo camera head.\\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# StereoBM} { StereoBM} } , \texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# StereoSGBM} { StereoSGBM} } & The stereo correspondence engines to be run on rectified stereo pairs.\\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# reprojectimageto3d} { reprojectImageTo3D()} } & Convert disparity map to 3D point cloud.\\
\texttt { \href { http://opencv.itseez.com/modules/calib3d/doc/camera_ calibration_ and_ 3d_ reconstruction.html\# findhomography} { findHomography()} } & Find best-fit perspective transformation between two 2D point sets. \\
\end { tabular}
To calibrate a camera, you can use \texttt { \href { http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/calibration.cpp} { calibration.cpp} } or
\texttt { \href { http://code.opencv.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 { http://code.opencv.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.itseez.com/modules/imgproc/doc/object_ detection.html\# matchtemplate} { matchTemplate} } & Compute proximity map for given template.\\
\texttt { \href { http://opencv.itseez.com/modules/objdetect/doc/cascade_ classification.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 { http://code.opencv.org/svn/opencv/trunk/opencv/samples/c/facedetect.cpp} { facedetect.cpp} } \\
\texttt { { 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 { http://code.opencv.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}