2010-06-09 12:56:00 +08:00
%
% The OpenCV cheatsheet structure:
%
2010-06-10 01:00:11 +08:00
% opencv data structures
% point, rect
% matrix
%
2010-06-09 12:56:00 +08:00
% creating matrices
% from scratch
% from previously allocated data: plain arrays, vectors
% converting to/from old-style structures
%
% element access, iteration through matrix elements
%
2010-06-10 01:00:11 +08:00
% copying & shuffling matrix data
2010-06-09 12:56:00 +08:00
% 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
2010-06-10 01:00:11 +08:00
% \pagestyle{empty}
2010-06-09 12:56:00 +08:00
% 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}
2010-06-10 01:00:11 +08:00
\Large { \textbf { OpenCV 2.1 Cheat Sheet (C++)} } \\
2010-06-09 12:56:00 +08:00
\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}
2010-06-10 01:00:11 +08:00
\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 } @{ } }
2010-06-10 01:02:44 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# point} { Point\_ } } & Template 2D point class \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# point3} { Point3\_ } } & Template 3D point class \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# size} { Size\_ } } & Template size (width, height) class \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# vec} { Vec} } & Template short vector class \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# scalar} { Scalar} } & 4-element vector \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# rect} { Rect} } & Rectangle \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# range} { Range} } & Integer value range \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# mat} { Mat} } & 2D dense array (used as both a matrix or an image)\\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# matnd} { MatND} } & Multi-dimensional dense array \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# sparsemat} { SparseMat} } & Multi-dimensional sparse array \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# ptr} { Ptr} } & Template smart pointer class
2010-06-10 01:00:11 +08:00
\end { tabular}
2010-06-09 12:56:00 +08:00
\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/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;} \\
2010-06-10 02:17:24 +08:00
\> \texttt { Mat A22 = (Mat\_ <float>(2, 2) <<} \\
2010-06-09 12:56:00 +08:00
\> \> \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/operations_ on_ arrays.html\# cv-randu} { randu} (image, Scalar(0), Scalar(256)); } \textit { // uniform dist} \\
\> \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-randn} { randn} (image, Scalar(128), Scalar(10)); } \textit { // Gaussian dist} \\
\textbf { Convert matrix to/from other structures} \\
2010-06-10 01:00:11 +08:00
\> \textbf { (without copying the data)} \\
2010-06-09 12:56:00 +08:00
\> \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} \\
2010-06-10 02:17:24 +08:00
\> \texttt { IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);} \\
2010-06-09 12:56:00 +08:00
\> \texttt { Mat newC = cvarrToMat(oldC0);} \\
\> \texttt { IplImage oldC1 = newC; CvMat oldC2 = newC;} \\
\textbf { ... (with copying the data)} \\
2010-06-10 02:30:04 +08:00
\> \texttt { Mat newC2 = cvarrToMat(oldC0).clone();} \\
\> \texttt { vector<Point2f> ptvec = Mat\_ <Point2f>(iP);} \\
2010-06-09 12:56:00 +08:00
\> \\
\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 } @{ } }
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::copyTo} { src.copyTo(dst)} } & Copy matrix to another one \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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/basic_ structures.html\# Mat::clone} { m.clone()} } & Make deep copy of a matrix \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::reshape} { m.reshape(nch,nrows)} } & Change matrix dimensions and/or number of channels without copying data \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::row} { m.row(i)} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::col} { m.col(i)} } & Take a matrix row/column \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::rowRange} { m.rowRange(Range(i1,i2))} }
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::colRange} { m.colRange(Range(j1,j2))} } & \ \ \ \ \ \ \ Take a matrix row/column span \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::diag} { m.diag(i)} } & Take a matrix diagonal \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# index-1245} { m(Range(i1,i2),Range(j1,j2)), m(roi)} } & \ \ \ \ \ \ \ \ \ \ \ \ \ Take a submatrix \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html\# Mat::repeat} { m.repeat(ny,nx)} } & Make a bigger matrix from a smaller one \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-flip} { flip(src,dst,dir)} } & Reverse the order of matrix rows and/or columns \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-split} { split(...)} } & Split multi-channel matrix into separate channels \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-merge} { merge(...)} } & Make a multi-channel matrix out of the separate channels \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-mixchannels} { mixChannels(...)} } & Generalized form of split() and merge() \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-randshuffle} { randShuffle(...)} } & Randomly shuffle matrix elements \\
2010-06-09 12:56:00 +08:00
\end { tabular}
2010-06-10 01:30:11 +08:00
\begin { tabbing}
Exa\= mple 1. Smooth image ROI in-place\\
\> \texttt { Mat imgroi = image(Rect(10, 20, 100, 100));} \\
2010-06-10 02:17:24 +08:00
\> \texttt { GaussianBlur(imgroi, imgroi, Size(5, 5), 1.2, 1.2);} \\
2010-06-10 01:30:11 +08:00
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}
2010-06-09 12:56:00 +08:00
\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/operations_ on_ arrays.html\# cv-add} { add()} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-subtract} { subtract()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-multiply} { multiply()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-divide} { divide()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-absdiff} { absdiff()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# bitwise-and} { bitwise\_ and()} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# bitwise-or} { bitwise\_ or()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# bitwise-xor} { bitwise\_ xor()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-max} { max()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-min} { min()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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 { \{ } \\
2010-06-10 02:17:24 +08:00
\> \texttt { Mat a1(rgba1.size(), rgba1.type()), ra1;} \\
\> \texttt { Mat a2(rgba2.size(), rgba2.type());} \\
2010-06-09 12:56:00 +08:00
\> \texttt { int mixch[]=\{ 3, 0, 3, 1, 3, 2, 3, 3\} ;} \\
2010-06-10 02:17:24 +08:00
\> \texttt { mixChannels(\& rgba1, 1, \& a1, 1, mixch, 4);} \\
\> \texttt { mixChannels(\& rgba2, 1, \& a2, 1, mixch, 4);} \\
2010-06-09 12:56:00 +08:00
\> \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/operations_ on_ arrays.html\# cv-sum} { sum()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-mean} { mean()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-mean-stddev} { meanStdDev()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-norm} { norm()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-countnonzero} { countNonZero()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-minmaxloc} { minMaxLoc()} } ,
-- various statistics of matrix elements.
\item
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-exp} { exp()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-log} { log()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-pow} { pow()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-sqrt} { sqrt()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-carttopolar} { cartToPolar()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-polarToCart} { polarToCart()} }
2010-06-10 01:00:11 +08:00
-- the classical math functions.
2010-06-09 12:56:00 +08:00
\item
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-scaleadd} { scaleAdd()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-transpose} { transpose()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-gemm} { gemm()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-invert} { invert()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-solve} { solve()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-determinant} { determinant()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-trace} { trace()} }
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-eigen} { eigen()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-SVD} { SVD} } ,
-- the algebraic functions + SVD class.
\item
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-dft} { dft()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-idft} { idft()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-dct} { dct()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/operations_ on_ arrays.html\# cv-idct} { idct()} } ,
-- discrete Fourier and cosine transformations
\end { itemize}
2010-06-10 01:00:11 +08:00
For some operations a more convenient \href { http://opencv.willowgarage.com/documentation/cpp/basic_ structures.html#matrix-expressions} { algebraic notation} can be used, for example:
2010-06-09 12:56:00 +08:00
\begin { tabbing}
\texttt { Mat} \= { } \texttt { delta = (J.t()*J + lambda*} \\
2010-06-10 02:17:24 +08:00
\> \texttt { Mat::eye(J.cols, J.cols, J.type()))} \\
2010-06-09 12:56:00 +08:00
\> \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 } @{ } }
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-filter2d} { filter2D()} } & Non-separable linear filter \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-sepfilter2d} { sepFilter2D()} } & Separable linear filter \\
2010-06-09 12:56:00 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-blur} { boxFilter()} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-gaussianblur} { GaussianBlur()} } ,
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-medianblur} { medianBlur()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-bilateralfilter} { bilateralFilter()} }
2010-06-09 12:56:00 +08:00
& Smooth the image with one of the linear or non-linear filters \\
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-sobel} { Sobel()} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-scharr} { Scharr()} }
& Compute the spatial image derivatives \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-laplacian} { Laplacian()} } & compute Laplacian: $ \Delta I = \frac { \partial ^ 2 I } { \partial x ^ 2 } + \frac { \partial ^ 2 I } { \partial y ^ 2 } $ \\
2010-06-09 12:56:00 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-erode} { erode()} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/image_ filtering.html\# cv-dilate} { dilate()} } & Erode or dilate the image \\
\end { tabular}
\begin { tabbing}
2010-06-10 02:30:04 +08:00
Exa\= mple. Filter image in-place with a 3x3 high-pass kernel\\
2010-06-09 12:56:00 +08:00
\> (preserve negative responses by shifting the result by 128):\\
2010-06-10 02:17:24 +08:00
\texttt { filter2D(image, image, image.depth(), (Mat\_ <float>(3,3)<<} \\
\> \texttt { -1, -1, -1, -1, 9, -1, -1, -1, -1), Point(1,1), 128);} \\
2010-06-09 12:56:00 +08:00
\end { tabbing}
\subsection { Geometrical Transformations}
\begin { tabular} { @{ } p{ \the \MyLen } %
@{ } p{ \linewidth -\the \MyLen } @{ } }
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/geometric_ image_ transformations.html\# cv-resize} { resize()} } & Resize image \\
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/geometric_ image_ transformations.html\# cv-getrectsubpix} { getRectSubPix()} } & Extract an image patch \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/geometric_ image_ transformations.html\# cv-warpaffine} { warpAffine()} } & Warp image affinely\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/geometric_ image_ transformations.html\# cv-warpperspective} { warpPerspective()} } & Warp image perspectively\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/geometric_ image_ transformations.html\# cv-remap} { remap()} } & Generic image warping\\
2010-06-09 12:56:00 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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/miscellaneous_ image_ transformations.html\# cvtColor} { cvtColor()} } & Convert image from one color space to another \\
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# threshold} { threshold()} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# adaptivethreshold} { adaptivethreshold()} } & Convert grayscale image to binary image using a fixed or a variable threshold \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# floodfill} { floodFill()} } & Find a connected component using region growing algorithm\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# floodfill} { integral()} } & Compute integral image \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# distancetransform} { distanceTransform()} }
& build distance map or discrete Voronoi diagram for a binary image. \\
2010-06-09 12:56:00 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# floodfill} { watershed()} } ,
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/miscellaneous_ image_ transformations.html\# grabcut} { grabCut()} }
2010-06-10 01:00:11 +08:00
& marker-based image segmentation algorithms.
See the samples \texttt { \href { https://code.ros.org/svn/opencv/trunk/opencv/samples/c/watershed.cpp} { watershed.cpp} } and \texttt { \href { https://code.ros.org/svn/opencv/trunk/opencv/samples/c/grabcut.c} { grabcut.cpp} } .
2010-06-09 12:56:00 +08:00
\end { tabular}
\subsection { Histograms}
\begin { tabular} { @{ } p{ \the \MyLen } %
@{ } p{ \linewidth -\the \MyLen } @{ } }
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/histograms.html\# calchist} { calcHist()} } & Compute image(s) histogram \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/histograms.html\# calcbackproject} { calcBackProject()} } & Back-project the histogram \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/histograms.html\# equalizehist} { equalizeHist()} } & Normalize image brightness and contrast\\
2010-06-09 12:56:00 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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/c/squares.c} { squares.c} }
samples on what are the contours and how to use them.
\section { Data I/O}
2010-06-10 01:00:11 +08:00
\href { http://opencv.willowgarage.com/documentation/cpp/xml_ yaml_ persistence.html\# filestorage} { XML/YAML storages} are collections (possibly nested) of scalar values, structures and heterogeneous lists.
2010-06-09 12:56:00 +08:00
\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];} \\
2010-06-10 02:17:24 +08:00
\texttt { int m = (int)tl[2]["month"], d = (int)tl[2]["day"];} \\
2010-06-09 12:56:00 +08:00
\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} \\
2010-06-10 02:24:19 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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/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/reading_ and_ writing_ images_ and_ video.html\# cv-imread} { imread} ("myimage.jpg", 0);} \\
2010-06-09 12:56:00 +08:00
\end { tabbing}
2010-06-10 01:00:11 +08:00
\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.}
2010-06-09 12:56:00 +08:00
\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 } @{ } }
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/user_ interface.html\# cv-namedwindow} { namedWindow(winname,flags)} } & \ \ \ \ \ \ \ \ \ \ Create named highgui window \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/user_ interface.html\# cv-destroywindow} { destroyWindow(winname)} } & \ \ \ Destroy the specified window \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/user_ interface.html\# cv-imshow} { imshow(winname, mtx)} } & Show image in the window \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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.} \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/user_ interface.html\# cv-createTrackbar} { createTrackbar(...)} } & Add trackbar (slider) to the specified window \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/user_ interface.html\# cv-setmousecallback} { setMouseCallback(...)} } & \ \ Set the callback on mouse clicks and movements in the specified window \\
2010-06-09 12:56:00 +08:00
\end { tabular}
See \texttt { \href { https://code.ros.org/svn/opencv/trunk/opencv/samples/c/camshiftdemo.c} { camshiftdemo.c} } 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 } @{ } }
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-calibratecamera} { calibrateCamera()} } & Calibrate camera from several views of a calibration pattern. \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-findchessboardcorners} { findChessboardCorners()} } & \ \ \ \ \ \ Find feature points on the checkerboard calibration pattern. \\
2010-06-09 12:56:00 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-solvepnp} { solvePnP()} } & Find the object pose from the known projections of its feature points. \\
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-stereocalibrate} { stereoCalibrate()} } & Calibrate stereo camera. \\
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-stereorectify} { stereoRectify()} } & Compute the rectification transforms for a calibrated stereo camera.\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-initundistortrectifymap} { initUndistortRectifyMap()} } & \ \ \ \ \ \ Compute rectification map (for \texttt { remap()} ) for each stereo camera head.\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-StereoBM} { StereoBM} } , \texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-StereoSGBM} { StereoSGBM} } & The stereo correspondence engines to be run on rectified stereo pairs.\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-reprojectimageto3d} { reprojectImageTo3D()} } & Convert disparity map to 3D point cloud.\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/camera_ calibration_ and_ 3d_ reconstruction.html\# cv-findhomography} { findHomography()} } & Find best-fit perspective transformation between two 2D point sets. \\
2010-06-09 12:56:00 +08:00
\end { tabular}
To calibrate a camera, you can use \texttt { \href { https://code.ros.org/svn/opencv/trunk/opencv/samples/c/calibration.cpp} { calibration.cpp} } or
\texttt { \href { https://code.ros.org/svn/opencv/trunk/opencv/samples/c/stereo\_ calib.cpp} { stereo\_ calib.cpp} } samples.
2010-06-10 01:00:11 +08:00
To get the disparity maps and the point clouds, use
2010-06-09 12:56:00 +08:00
\texttt { \href { https://code.ros.org/svn/opencv/trunk/opencv/samples/c/stereo\_ match.cpp} { stereo\_ match.cpp} } sample.
\section { Object Detection}
\begin { tabular} { @{ } p{ \the \MyLen } %
@{ } p{ \linewidth -\the \MyLen } @{ } }
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/object_ detection.html\# matchTemplate} { matchTemplate} } & Compute proximity map for given template.\\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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/c/facedetect.cpp} { facedetect.cpp} } \\
2010-06-09 12:56:00 +08:00
2010-06-10 01:00:11 +08:00
\texttt { \href { http://opencv.willowgarage.com/documentation/cpp/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/c/peopledetect.cpp} { peopledetect.cpp} } \\
2010-06-09 12:56:00 +08:00
\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}