mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
620 lines
32 KiB
620 lines
32 KiB
% |
|
% 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} |
|
\usepackage[T1]{fontenc} |
|
\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://docs.opencv.org}. 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://docs.opencv.org/modules/core/doc/basic_structures.html\#Point_}{Point\_}} & Template 2D point class \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Point3_}{Point3\_}} & Template 3D point class \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Size_}{Size\_}} & Template size (width, height) class \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Vec}{Vec}} & Template short vector class \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Matx}{Matx}} & Template small matrix class \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Scalar_}{Scalar}} & 4-element vector \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Rect_}{Rect}} & Rectangle \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Range}{Range}} & Integer value range \\ |
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/core/doc/basic_structures.html\#sparsemat}{SparseMat}} & Multi-dimensional sparse array \\ |
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/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://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#randu}{randu}(image, Scalar(0), Scalar(256)); }\textit{// uniform dist}\\ |
|
\> \texttt{\href{http://docs.opencv.org/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; x < 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://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-copyto}{src.copyTo(dst)}} & Copy matrix to another one \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-convertto}{src.convertTo(dst,type,scale,shift)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Scale and convert to another datatype \\ |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-clone}{m.clone()}} & Make deep copy of a matrix \\ |
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-row}{m.row(i)}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-col}{m.col(i)}} & Take a matrix row/column \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-rowrange}{m.rowRange(Range(i1,i2))}} |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-colrange}{m.colRange(Range(j1,j2))}} & \ \ \ \ \ \ \ Take a matrix row/column span \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-diag}{m.diag(i)}} & Take a matrix diagonal \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Mat}{m(Range(i1,i2),Range(j1,j2)), m(roi)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ Take a submatrix \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#repeat}{m.repeat(ny,nx)}} & Make a bigger matrix from a smaller one \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#flip}{flip(src,dst,dir)}} & Reverse the order of matrix rows and/or columns \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#split}{split(...)}} & Split multi-channel matrix into separate channels \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#merge}{merge(...)}} & Make a multi-channel matrix out of the separate channels \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#mixchannels}{mixChannels(...)}} & Generalized form of split() and merge() \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#add}{add()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#subtract}{subtract()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#multiply}{multiply()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#divide}{divide()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#absdiff}{absdiff()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#bitwise-and}{bitwise\_and()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#bitwise-or}{bitwise\_or()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#bitwise-xor}{bitwise\_xor()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#max}{max()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#min}{min()}}, |
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#sum}{sum()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#mean}{mean()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#meanstddev}{meanStdDev()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#norm}{norm()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#countnonzero}{countNonZero()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#minmaxloc}{minMaxLoc()}}, |
|
|
|
-- various statistics of matrix elements. |
|
|
|
\item |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#exp}{exp()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#log}{log()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#pow}{pow()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#sqrt}{sqrt()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#carttopolar}{cartToPolar()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#polartocart}{polarToCart()}} |
|
|
|
-- the classical math functions. |
|
|
|
\item |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#scaleadd}{scaleAdd()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#transpose}{transpose()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#gemm}{gemm()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#invert}{invert()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#solve}{solve()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#determinant}{determinant()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#trace}{trace()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#eigen}{eigen()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#SVD}{SVD}}, |
|
|
|
-- the algebraic functions + SVD class. |
|
|
|
\item |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#dft}{dft()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#idft}{idft()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#dct}{dct()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#idct}{idct()}}, |
|
|
|
-- discrete Fourier and cosine transformations |
|
|
|
\end{itemize} |
|
|
|
For some operations a more convenient \href{http://docs.opencv.org/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://docs.opencv.org/modules/imgproc/doc/filtering.html\#filter2d}{filter2D()}} & Non-separable linear filter \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#sepfilter2d}{sepFilter2D()}} & Separable linear filter \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#blur}{boxFilter()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#gaussianblur}{GaussianBlur()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#medianblur}{medianBlur()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#bilateralfilter}{bilateralFilter()}} |
|
& Smooth the image with one of the linear or non-linear filters \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#sobel}{Sobel()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#scharr}{Scharr()}} |
|
& Compute the spatial image derivatives \\ |
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/imgproc/doc/filtering.html\#erode}{erode()}}, \texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#resize}{resize()}} & Resize image \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#getrectsubpix}{getRectSubPix()}} & Extract an image patch \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#warpaffine}{warpAffine()}} & Warp image affinely\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#warpperspective}{warpPerspective()}} & Warp image perspectively\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#remap}{remap()}} & Generic image warping\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#cvtcolor}{cvtColor()}} & Convert image from one color space to another \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#threshold}{threshold()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#adaptivethreshold}{adaptivethreshold()}} & Convert grayscale image to binary image using a fixed or a variable threshold \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#floodfill}{floodFill()}} & Find a connected component using region growing algorithm\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#integral}{integral()}} & Compute integral image \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#distancetransform}{distanceTransform()}} |
|
& build distance map or discrete Voronoi diagram for a binary image. \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#watershed}{watershed()}}, |
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#grabcut}{grabCut()}} |
|
& marker-based image segmentation algorithms. |
|
See the samples \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/watershed.cpp}{watershed.cpp}} and \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/grabcut.cpp}{grabcut.cpp}}. |
|
|
|
\end{tabular} |
|
|
|
\subsection{Histograms} |
|
|
|
\begin{tabular}{@{}p{\the\MyLen}% |
|
@{}p{\linewidth-\the\MyLen}@{}} |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#calchist}{calcHist()}} & Compute image(s) histogram \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#calcbackproject}{calcBackProject()}} & Back-project the histogram \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#equalizehist}{equalizeHist()}} & Normalize image brightness and contrast\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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{https://github.com/opencv/opencv/tree/master/samples/cpp/contours2.cpp}{contours2.cpp}} and \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/squares.cpp}{squares.cpp}} |
|
samples on what are the contours and how to use them. |
|
|
|
\section{Data I/O} |
|
|
|
\href{http://docs.opencv.org/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://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html\#imwrite}{imwrite}("myimage.jpg", image);}\\ |
|
\texttt{Mat image\_color\_copy = \href{http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html\#imread}{imread}("myimage.jpg", 1);}\\ |
|
\texttt{Mat image\_grayscale\_copy = \href{http://docs.opencv.org/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://docs.opencv.org/modules/highgui/doc/user_interface.html\#namedwindow}{namedWindow(winname,flags)}} & \ \ \ \ \ \ \ \ \ \ Create named highgui window \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#destroywindow}{destroyWindow(winname)}} & \ \ \ Destroy the specified window \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#imshow}{imshow(winname, mtx)}} & Show image in the window \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/highgui/doc/user_interface.html\#createtrackbar}{createTrackbar(...)}} & Add trackbar (slider) to the specified window \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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{https://github.com/opencv/opencv/tree/master/samples/cpp/camshiftdemo.cpp}{camshiftdemo.cpp}} and other \href{https://github.com/opencv/opencv/tree/master/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://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#calibratecamera}{calibrateCamera()}} & Calibrate camera from several views of a calibration pattern. \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#findchessboardcorners}{findChessboardCorners()}} & \ \ \ \ \ \ Find feature points on the checkerboard calibration pattern. \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#stereocalibrate}{stereoCalibrate()}} & Calibrate stereo camera. \\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#stereorectify}{stereoRectify()}} & Compute the rectification transforms for a calibrated stereo camera.\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#initundistortrectifymap}{initUndistortRectifyMap()}} & \ \ \ \ \ \ Compute rectification map (for \texttt{remap()}) for each stereo camera head.\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#StereoBM}{StereoBM}}, \texttt{\href{http://docs.opencv.org/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://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#reprojectimageto3d}{reprojectImageTo3D()}} & Convert disparity map to 3D point cloud.\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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{https://github.com/opencv/opencv/tree/master/samples/cpp/calibration.cpp}{calibration.cpp}} or |
|
\texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/stereo\_calib.cpp}{stereo\_calib.cpp}} samples. |
|
To get the disparity maps and the point clouds, use |
|
\texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/stereo\_match.cpp}{stereo\_match.cpp}} sample. |
|
|
|
\section{Object Detection} |
|
|
|
\begin{tabular}{@{}p{\the\MyLen}% |
|
@{}p{\linewidth-\the\MyLen}@{}} |
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/object_detection.html\#matchtemplate}{matchTemplate}} & Compute proximity map for given template.\\ |
|
|
|
\texttt{\href{http://docs.opencv.org/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{https://github.com/opencv/opencv/tree/master/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{https://github.com/opencv/opencv/tree/master/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}
|
|
|