]> rtime.felk.cvut.cz Git - opencv.git/blob - opencv/doc/cv_struct_shape_analysis.tex
Fixed ~100 argument name mismatches
[opencv.git] / opencv / doc / cv_struct_shape_analysis.tex
1 \section{Structural Analysis and Shape Descriptors}
2
3 \ifCPy
4
5 \cvCPyFunc{ApproxChains}
6 Approximates Freeman chain(s) with a polygonal curve.
7
8 \cvdefC{
9 CvSeq* cvApproxChains( \par CvSeq* src\_seq,\par CvMemStorage* storage,\par int method=CV\_CHAIN\_APPROX\_SIMPLE,\par double parameter=0,\par int minimal\_perimeter=0,\par int recursive=0 );
10 }
11 \cvdefPy{ApproxChains(src\_seq,storage,method=CV\_CHAIN\_APPROX\_SIMPLE,parameter=0,minimal\_perimeter=0,recursive=0)-> chains}
12
13 \begin{description}
14 \cvarg{src\_seq}{Pointer to the chain that can refer to other chains}
15 \cvarg{storage}{Storage location for the resulting polylines}
16 \cvarg{method}{Approximation method (see the description of the function \cvCPyCross{FindContours})}
17 \cvarg{parameter}{Method parameter (not used now)}
18 \cvarg{minimal\_perimeter}{Approximates only those contours whose perimeters are not less than \texttt{minimal\_perimeter}. Other chains are removed from the resulting structure}
19 \cvarg{recursive}{If not 0, the function approximates all chains that access can be obtained to from \texttt{src\_seq} by using the \texttt{h\_next} or \texttt{v\_next links}. If 0, the single chain is approximated}
20 \end{description}
21
22 This is a stand-alone approximation routine. The function \texttt{cvApproxChains} works exactly in the same way as \cvCPyCross{FindContours} with the corresponding approximation flag. The function returns pointer to the first resultant contour. Other approximated contours, if any, can be accessed via the \texttt{v\_next} or \texttt{h\_next} fields of the returned structure.
23
24 \cvCPyFunc{ApproxPoly}
25 Approximates polygonal curve(s) with the specified precision.
26
27 \cvdefC{
28 CvSeq* cvApproxPoly( \par const void* src\_seq,\par int header\_size,\par CvMemStorage* storage,\par int method,\par double parameter,\par int parameter2=0 );
29 }
30 \cvdefPy{
31 ApproxPoly(src\_seq, storage, method, parameter=0, parameter2=0) -> sequence
32 }
33
34 \begin{description}
35 \cvarg{src\_seq}{Sequence of an array of points}
36 \ifC
37 \cvarg{header\_size}{Header size of the approximated curve[s]}
38 \fi
39 \cvarg{storage}{Container for the approximated contours. If it is NULL, the input sequences' storage is used}
40 \cvarg{method}{Approximation method; only \texttt{CV\_POLY\_APPROX\_DP} is supported, that corresponds to the Douglas-Peucker algorithm}
41 \cvarg{parameter}{Method-specific parameter; in the case of \texttt{CV\_POLY\_APPROX\_DP} it is a desired approximation accuracy}
42 \cvarg{parameter2}{If case if \texttt{src\_seq} is a sequence, the parameter determines whether the single sequence should be approximated or all sequences on the same level or below \texttt{src\_seq} (see \cvCPyCross{FindContours} for description of hierarchical contour structures). If \texttt{src\_seq} is an array CvMat* of points, the parameter specifies whether the curve is closed (\texttt{parameter2}!=0) or not (\texttt{parameter2} =0)}
43 \end{description}
44
45 The function approximates one or more curves and
46 returns the approximation result[s]. In the case of multiple curves,
47 the resultant tree will have the same structure as the input one (1:1
48 correspondence).
49
50 \cvCPyFunc{ArcLength}
51 Calculates the contour perimeter or the curve length.
52
53 \cvdefC{
54 double cvArcLength( \par const void* curve,\par CvSlice slice=CV\_WHOLE\_SEQ,\par int isClosed=-1 );
55 }\cvdefPy{ArcLength(curve,slice=CV\_WHOLE\_SEQ,isClosed=-1)-> double}
56
57 \begin{description}
58 \cvarg{curve}{Sequence or array of the curve points}
59 \cvarg{slice}{Starting and ending points of the curve, by default, the whole curve length is calculated}
60 \cvarg{isClosed}{Indicates whether the curve is closed or not. There are 3 cases:
61 \begin{itemize}
62   \item $\texttt{isClosed}=0$ the curve is assumed to be unclosed.
63   \item $\texttt{isClosed}>0$ the curve is assumed to be closed.
64   \item $\texttt{isClosed}<0$ if curve is sequence, the flag \texttt{CV\_SEQ\_FLAG\_CLOSED} of \texttt{((CvSeq*)curve)->flags} is checked to determine if the curve is closed or not, otherwise (curve is represented by array (CvMat*) of points) it is assumed to be unclosed.
65 \end{itemize}}
66 \end{description}
67
68 The function calculates the length or curve as the sum of lengths of segments between subsequent points
69
70 \cvCPyFunc{BoundingRect}
71 Calculates the up-right bounding rectangle of a point set.
72
73 \cvdefC{
74 CvRect cvBoundingRect( CvArr* points, int update=0 );
75 }\cvdefPy{BoundingRect(points,update=0)-> CvRect}
76
77 \begin{description}
78 \cvarg{points}{2D point set, either a sequence or vector (\texttt{CvMat}) of points}
79 \cvarg{update}{The update flag. See below.}
80 \end{description}
81
82 The function returns the up-right bounding rectangle for a 2d point set.
83 Here is the list of possible combination of the flag values and type of \texttt{points}:
84
85 \begin{tabular}{|c|c|p{3in}|}
86 \hline
87 update & points & action \\ \hline
88 0 & \texttt{CvContour\*} & the bounding rectangle is not calculated, but it is taken from \texttt{rect} field of the contour header.\\ \hline
89 1 & \texttt{CvContour\*} & the bounding rectangle is calculated and written to \texttt{rect} field of the contour header.\\ \hline
90 0 & \texttt{CvSeq\*} or \texttt{CvMat\*} & the bounding rectangle is calculated and returned.\\ \hline
91 1 & \texttt{CvSeq\*} or \texttt{CvMat\*} & runtime error is raised.\\ \hline
92 \end{tabular}
93
94 \cvCPyFunc{BoxPoints}
95 Finds the box vertices.
96
97 \cvdefC{
98 void cvBoxPoints( \par CvBox2D box,\par CvPoint2D32f pt[4] );
99 }\cvdefPy{BoxPoints(box)-> points}
100
101 \begin{description}
102 \cvarg{box}{Box}
103 \cvarg{points}{Array of vertices}
104 \end{description}
105
106 The function calculates the vertices of the input 2d box. Here is the function code:
107
108 \begin{lstlisting}
109 void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] )
110 {
111     float a = (float)cos(box.angle)*0.5f;
112     float b = (float)sin(box.angle)*0.5f;
113
114     pt[0].x = box.center.x - a*box.size.height - b*box.size.width;
115     pt[0].y = box.center.y + b*box.size.height - a*box.size.width;
116     pt[1].x = box.center.x + a*box.size.height - b*box.size.width;
117     pt[1].y = box.center.y - b*box.size.height - a*box.size.width;
118     pt[2].x = 2*box.center.x - pt[0].x;
119     pt[2].y = 2*box.center.y - pt[0].y;
120     pt[3].x = 2*box.center.x - pt[1].x;
121     pt[3].y = 2*box.center.y - pt[1].y;
122 }
123 \end{lstlisting}
124
125 \cvCPyFunc{CalcPGH}
126 Calculates a pair-wise geometrical histogram for a contour.
127
128 \cvdefC{
129 void cvCalcPGH( const CvSeq* contour, CvHistogram* hist );
130 }\cvdefPy{CalcPGH(contour,hist)-> None}
131
132 \begin{description}
133 \cvarg{contour}{Input contour. Currently, only integer point coordinates are allowed}
134 \cvarg{hist}{Calculated histogram; must be two-dimensional}
135 \end{description}
136
137 The function calculates a
138 2D pair-wise geometrical histogram (PGH), described in
139 \cvCPyCross{Iivarinen97}
140 for the contour. The algorithm considers every pair of contour
141 edges. The angle between the edges and the minimum/maximum distances
142 are determined for every pair. To do this each of the edges in turn
143 is taken as the base, while the function loops through all the other
144 edges. When the base edge and any other edge are considered, the minimum
145 and maximum distances from the points on the non-base edge and line of
146 the base edge are selected. The angle between the edges defines the row
147 of the histogram in which all the bins that correspond to the distance
148 between the calculated minimum and maximum distances are incremented
149 (that is, the histogram is transposed relatively to the \cvCPyCross{Iivarninen97}
150 definition). The histogram can be used for contour matching.
151
152 \cvCPyFunc{CalcEMD2}
153 Computes the "minimal work" distance between two weighted point configurations.
154
155 \cvdefC{
156 float cvCalcEMD2( \par const CvArr* signature1,\par const CvArr* signature2,\par int distance\_type,\par CvDistanceFunction distance\_func=NULL,\par const CvArr* cost\_matrix=NULL,\par CvArr* flow=NULL,\par float* lower\_bound=NULL,\par void* userdata=NULL );
157 }\cvdefPy{CalcEMD2(signature1, signature2, distance\_type, distance\_func = None, cost\_matrix=None, flow=None, lower\_bound=None, userdata = None) -> float}
158
159 \begin{description}
160 \cvarg{signature1}{First signature, a $\texttt{size1}\times \texttt{dims}+1$ floating-point matrix. Each row stores the point weight followed by the point coordinates. The matrix is allowed to have a single column (weights only) if the user-defined cost matrix is used}
161 \cvarg{signature2}{Second signature of the same format as \texttt{signature1}, though the number of rows may be different. The total weights may be different, in this case an extra "dummy" point is added to either \texttt{signature1} or \texttt{signature2}}
162 \cvarg{distance\_type}{Metrics used; \texttt{CV\_DIST\_L1, CV\_DIST\_L2}, and \texttt{CV\_DIST\_C} stand for one of the standard metrics; \texttt{CV\_DIST\_USER} means that a user-defined function \texttt{distance\_func} or pre-calculated \texttt{cost\_matrix} is used}
163 \cvarg{distance\_func}{The user-defined distance function. It takes coordinates of two points and returns the distance between the points}
164 \cvarg{cost\_matrix}{The user-defined $\texttt{size1}\times \texttt{size2}$ cost matrix. At least one of \texttt{cost\_matrix} and \texttt{distance\_func} must be NULL. Also, if a cost matrix is used, lower boundary (see below) can not be calculated, because it needs a metric function}
165 \cvarg{flow}{The resultant $\texttt{size1} \times \texttt{size2}$ flow matrix: $\texttt{flow}_{i,j}$ is a flow from $i$ th point of \texttt{signature1} to $j$ th point of \texttt{signature2}}
166 \cvarg{lower\_bound}{Optional input/output parameter: lower boundary of distance between the two signatures that is a distance between mass centers. The lower boundary may not be calculated if the user-defined cost matrix is used, the total weights of point configurations are not equal, or if the signatures consist of weights only (i.e. the signature matrices have a single column). The user \textbf{must} initialize \texttt{*lower\_bound}. If the calculated distance between mass centers is greater or equal to \texttt{*lower\_bound} (it means that the signatures are far enough) the function does not calculate EMD. In any case \texttt{*lower\_bound} is set to the calculated distance between mass centers on return. Thus, if user wants to calculate both distance between mass centers and EMD, \texttt{*lower\_bound} should be set to 0}
167 \cvarg{userdata}{Pointer to optional data that is passed into the user-defined distance function}
168 \end{description}
169
170 \begin{lstlisting}
171 typedef float (*CvDistanceFunction)(const float* f1, const float* f2, void* userdata);
172 \end{lstlisting}
173
174 The function computes the earth mover distance and/or
175 a lower boundary of the distance between the two weighted point
176 configurations. One of the applications described in \cvCPyCross{RubnerSept98} is
177 multi-dimensional histogram comparison for image retrieval. EMD is a a
178 transportation problem that is solved using some modification of a simplex
179 algorithm, thus the complexity is exponential in the worst case, though, on average
180 it is much faster. In the case of a real metric the lower boundary
181 can be calculated even faster (using linear-time algorithm) and it can
182 be used to determine roughly whether the two signatures are far enough
183 so that they cannot relate to the same object.
184
185 \cvCPyFunc{CheckContourConvexity}
186 Tests contour convexity.
187
188 \cvdefC{
189 int cvCheckContourConvexity( const CvArr* contour );
190 }\cvdefPy{CheckContourConvexity(contour)-> int}
191
192 \begin{description}
193 \cvarg{contour}{Tested contour (sequence or array of points)}
194 \end{description}
195
196 The function tests whether the input contour is convex or not. The contour must be simple, without self-intersections.
197
198 \cvfunc{CvConvexityDefect}\label{CvConvexityDefect}
199
200 Structure describing a single contour convexity defect.
201
202 \begin{lstlisting}
203 typedef struct CvConvexityDefect
204 {
205     CvPoint* start; /* point of the contour where the defect begins */
206     CvPoint* end; /* point of the contour where the defect ends */
207     CvPoint* depth_point; /* the farthest from the convex hull point within the defect */
208     float depth; /* distance between the farthest point and the convex hull */
209 } CvConvexityDefect;
210 \end{lstlisting}
211
212 % ===== Picture. Convexity defects of hand contour. =====
213 \includegraphics[width=0.5\textwidth]{pics/defects.png}
214
215 \cvCPyFunc{ContourArea}
216 Calculates the area of a whole contour or a contour section.
217
218 \cvdefC{
219 double cvContourArea( \par const CvArr* contour, \par CvSlice slice=CV\_WHOLE\_SEQ );
220 }
221 \cvdefPy{ContourArea(contour,slice=CV\_WHOLE\_SEQ)-> double}
222
223 \begin{description}
224 \cvarg{contour}{Contour (sequence or array of vertices)}
225 \cvarg{slice}{Starting and ending points of the contour section of interest, by default, the area of the whole contour is calculated}
226 \end{description}
227
228 The function calculates the area of a whole contour
229 or a contour section. In the latter case the total area bounded by the
230 contour arc and the chord connecting the 2 selected points is calculated
231 as shown on the picture below:
232
233 \includegraphics[width=0.5\textwidth]{pics/contoursecarea.png}
234
235 Orientation of the contour affects the area sign, thus the function may return a \emph{negative} result. Use the \texttt{fabs()} function from C runtime to get the absolute value of the area.
236
237 \cvCPyFunc{ContourFromContourTree}
238 Restores a contour from the tree.
239
240 \cvdefC{
241 CvSeq* cvContourFromContourTree( \par const CvContourTree* tree,\par CvMemStorage* storage,\par CvTermCriteria criteria );
242 }\cvdefPy{ContourFromContourTree(tree,storage,criteria)-> contour}
243
244 \begin{description}
245 \cvarg{tree}{Contour tree}
246 \cvarg{storage}{Container for the reconstructed contour}
247 \cvarg{criteria}{Criteria, where to stop reconstruction}
248 \end{description}
249
250 The function restores the contour from its binary tree representation. The parameter \texttt{criteria} determines the accuracy and/or the number of tree levels used for reconstruction, so it is possible to build an approximated contour. The function returns the reconstructed contour.
251
252 \cvCPyFunc{ConvexHull2}
253 Finds the convex hull of a point set.
254
255 \cvdefC{
256 CvSeq* cvConvexHull2( \par const CvArr* input,\par void* hull\_storage=NULL,\par int orientation=CV\_CLOCKWISE,\par int return\_points=0 );
257 }
258 \cvdefPy{ConvexHull2(points,hull\_storage,orientation=CV\_CLOCKWISE,return\_points=0)-> convex\_hull}
259
260 \begin{description}
261 \cvarg{points}{Sequence or array of 2D points with 32-bit integer or floating-point coordinates}
262 \cvarg{hull\_storage}{The destination array (CvMat*) or memory storage (CvMemStorage*) that will store the convex hull. If it is an array, it should be 1d and have the same number of elements as the input array/sequence. On output the header is modified as to truncate the array down to the hull size.  If \texttt{hull\_storage} is NULL then the convex hull will be stored in the same storage as the input sequence}
263 \cvarg{orientation}{Desired orientation of convex hull: \texttt{CV\_CLOCKWISE} or \texttt{CV\_COUNTER\_CLOCKWISE}}
264 \cvarg{return\_points}{If non-zero, the points themselves will be stored in the hull instead of indices if \texttt{hull\_storage} is an array, or pointers if \texttt{hull\_storage} is memory storage}
265 \end{description}
266
267 The function finds the convex hull of a 2D point set using Sklansky's algorithm. If \texttt{hull\_storage} is memory storage, the function creates a sequence containing the hull points or pointers to them, depending on \texttt{return\_points} value and returns the sequence on output.  If \texttt{hull\_storage} is a CvMat, the function returns NULL.
268
269 % ===== Example. Building convex hull for a sequence or array of points =====
270 \begin{lstlisting}
271 #include "cv.h"
272 #include "highgui.h"
273 #include <stdlib.h>
274
275 #define ARRAY  0 /* switch between array/sequence method by replacing 0<=>1 */
276
277 void main( int argc, char** argv )
278 {
279     IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
280     cvNamedWindow( "hull", 1 );
281
282 #if !ARRAY
283         CvMemStorage* storage = cvCreateMemStorage();
284 #endif
285
286     for(;;)
287     {
288         int i, count = rand()%100 + 1, hullcount;
289         CvPoint pt0;
290 #if !ARRAY
291         CvSeq* ptseq = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2,
292                                     sizeof(CvContour),
293                                     sizeof(CvPoint),
294                                     storage );
295         CvSeq* hull;
296
297         for( i = 0; i < count; i++ )
298         {
299             pt0.x = rand() % (img->width/2) + img->width/4;
300             pt0.y = rand() % (img->height/2) + img->height/4;
301             cvSeqPush( ptseq, &pt0 );
302         }
303         hull = cvConvexHull2( ptseq, 0, CV_CLOCKWISE, 0 );
304         hullcount = hull->total;
305 #else
306         CvPoint* points = (CvPoint*)malloc( count * sizeof(points[0]));
307         int* hull = (int*)malloc( count * sizeof(hull[0]));
308         CvMat point_mat = cvMat( 1, count, CV_32SC2, points );
309         CvMat hull_mat = cvMat( 1, count, CV_32SC1, hull );
310
311         for( i = 0; i < count; i++ )
312         {
313             pt0.x = rand() % (img->width/2) + img->width/4;
314             pt0.y = rand() % (img->height/2) + img->height/4;
315             points[i] = pt0;
316         }
317         cvConvexHull2( &point_mat, &hull_mat, CV_CLOCKWISE, 0 );
318         hullcount = hull_mat.cols;
319 #endif
320         cvZero( img );
321         for( i = 0; i < count; i++ )
322         {
323 #if !ARRAY
324             pt0 = *CV_GET_SEQ_ELEM( CvPoint, ptseq, i );
325 #else
326             pt0 = points[i];
327 #endif
328             cvCircle( img, pt0, 2, CV_RGB( 255, 0, 0 ), CV_FILLED );
329         }
330
331 #if !ARRAY
332         pt0 = **CV_GET_SEQ_ELEM( CvPoint*, hull, hullcount - 1 );
333 #else
334         pt0 = points[hull[hullcount-1]];
335 #endif
336
337         for( i = 0; i < hullcount; i++ )
338         {
339 #if !ARRAY
340             CvPoint pt = **CV_GET_SEQ_ELEM( CvPoint*, hull, i );
341 #else
342             CvPoint pt = points[hull[i]];
343 #endif
344             cvLine( img, pt0, pt, CV_RGB( 0, 255, 0 ));
345             pt0 = pt;
346         }
347
348         cvShowImage( "hull", img );
349
350         int key = cvWaitKey(0);
351         if( key == 27 ) // 'ESC'
352             break;
353
354 #if !ARRAY
355         cvClearMemStorage( storage );
356 #else
357         free( points );
358         free( hull );
359 #endif
360     }
361 }
362 \end{lstlisting}
363
364 \cvCPyFunc{ConvexityDefects}
365 Finds the convexity defects of a contour.
366
367 \cvdefC{
368 CvSeq* cvConvexityDefects( \par const CvArr* contour,\par const CvArr* convexhull,\par CvMemStorage* storage=NULL );
369 }\cvdefPy{ConvexityDefects(contour,convexhull,storage)-> convexity\_defects}
370
371 \begin{description}
372 \cvarg{contour}{Input contour}
373 \cvarg{convexhull}{Convex hull obtained using \cvCPyCross{ConvexHull2} that should contain pointers or indices to the contour points, not the hull points themselves (the \texttt{return\_points} parameter in \cvCPyCross{ConvexHull2} should be 0)}
374 \cvarg{storage}{Container for the output sequence of convexity defects. If it is NULL, the contour or hull (in that order) storage is used}
375 \end{description}
376
377 The function finds all convexity defects of the input contour and returns a sequence of the CvConvexityDefect structures.
378
379 \cvCPyFunc{CreateContourTree}
380 Creates a hierarchical representation of a contour.
381
382 \cvdefC{
383 CvContourTree* cvCreateContourTree( \par const CvSeq* contour,\par CvMemStorage* storage,\par double threshold );
384 }
385 \cvdefPy{CreateContourTree(contour,storage,threshold)-> contour\_tree}
386
387 \begin{description}
388 \cvarg{contour}{Input contour}
389 \cvarg{storage}{Container for output tree}
390 \cvarg{threshold}{Approximation accuracy}
391 \end{description}
392
393 The function creates a binary tree representation for the input \texttt{contour} and returns the pointer to its root. If the parameter \texttt{threshold} is less than or equal to 0, the function creates a full binary tree representation. If the threshold is greater than 0, the function creates a representation with the precision \texttt{threshold}: if the vertices with the interceptive area of its base line are less than \texttt{threshold}, the tree should not be built any further. The function returns the created tree.
394
395 \ifC % {
396
397 \cvCPyFunc{EndFindContours}
398 Finishes the scanning process.
399
400 \cvdefC{
401 CvSeq* cvEndFindContours( \par CvContourScanner* scanner );
402 }
403
404 \begin{description}
405 \cvarg{scanner}{Pointer to the contour scanner}
406 \end{description}
407
408 The function finishes the scanning process and returns a pointer to the first contour on the highest level.
409
410 \fi % }
411
412 \cvCPyFunc{FindContours}
413 Finds the contours in a binary image.
414
415 \cvdefC{
416 int cvFindContours(\par CvArr* image,\par CvMemStorage* storage,\par CvSeq** first\_contour,\par
417                     int header\_size=sizeof(CvContour),\par int mode=CV\_RETR\_LIST,\par
418                     int method=CV\_CHAIN\_APPROX\_SIMPLE,\par CvPoint offset=cvPoint(0,0) );
419 }\cvdefPy{FindContours(image, storage, mode=CV\_RETR\_LIST, method=CV\_CHAIN\_APPROX\_SIMPLE, offset=(0,0)) -> cvseq}
420
421 \begin{description}
422 \cvarg{image}{The source, an 8-bit single channel image. Non-zero pixels are treated as 1's, zero pixels remain 0's - the image is treated as \texttt{binary}. To get such a binary image from grayscale, one may use \cvCPyCross{Threshold}, \cvCPyCross{AdaptiveThreshold} or \cvCPyCross{Canny}. The function modifies the source image's content}
423 \cvarg{storage}{Container of the retrieved contours}
424 \ifC
425 \cvarg{first\_contour}{Output parameter, will contain the pointer to the first outer contour}
426 \cvarg{header\_size}{Size of the sequence header, $\ge \texttt{sizeof(CvChain)}$ if $\texttt{method} =\texttt{CV\_CHAIN\_CODE}$,
427 and $\ge \texttt{sizeof(CvContour)}$ otherwise}
428 \fi
429 \cvarg{mode}{Retrieval mode
430 \begin{description}
431   \cvarg{CV\_RETR\_EXTERNAL}{retrives only the extreme outer contours}
432   \cvarg{CV\_RETR\_LIST}{retrieves all of the contours and puts them in the list}
433   \cvarg{CV\_RETR\_CCOMP}{retrieves all of the contours and organizes them into a two-level hierarchy: on the top level are the external boundaries of the components, on the second level are the boundaries of the holes}
434   \cvarg{CV\_RETR\_TREE}{retrieves all of the contours and reconstructs the full hierarchy of nested contours}
435 \end{description}}
436 \cvarg{method}{Approximation method (for all the modes, except \texttt{CV\_LINK\_RUNS}, which uses built-in approximation)
437 \begin{description}
438   \cvarg{CV\_CHAIN\_CODE}{outputs contours in the Freeman chain code. All other methods output polygons (sequences of vertices)}
439   \cvarg{CV\_CHAIN\_APPROX\_NONE}{translates all of the points from the chain code into points}
440   \cvarg{CV\_CHAIN\_APPROX\_SIMPLE}{compresses horizontal, vertical, and diagonal segments and leaves only their end points}
441   \cvarg{CV\_CHAIN\_APPROX\_TC89\_L1,CV\_CHAIN\_APPROX\_TC89\_KCOS}{applies one of the flavors of the Teh-Chin chain approximation algorithm.}
442   \cvarg{CV\_LINK\_RUNS}{uses a completely different contour retrieval algorithm by linking horizontal segments of 1's. Only the \texttt{CV\_RETR\_LIST} retrieval mode can be used with this method.}
443 \end{description}}
444 \cvarg{offset}{Offset, by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context}
445 \end{description}
446
447 The function retrieves contours from the
448 binary image and returns the number of retrieved contours. The
449 pointer \texttt{first\_contour} is filled by the function. It will
450 contain a pointer to the first outermost contour or \texttt{NULL} if no
451 contours are detected (if the image is completely black). Other
452 contours may be reached from \texttt{first\_contour} using the
453 \texttt{h\_next} and \texttt{v\_next} links. The sample in the
454 \cvCPyCross{DrawContours} discussion shows how to use contours for
455 connected component detection. Contours can be also used for shape
456 analysis and object recognition - see \texttt{squares.c} in the OpenCV
457 sample directory.
458
459
460 \ifC % {
461
462 \cvCPyFunc{FindNextContour}
463 Finds the next contour in the image.
464
465 \cvdefC{
466 CvSeq* cvFindNextContour( \par CvContourScanner scanner );
467 }
468
469 \begin{description}
470 \cvarg{scanner}{Contour scanner initialized by \cvCPyCross{StartFindContours} }
471 \end{description}
472
473 The function locates and retrieves the next contour in the image and returns a pointer to it. The function returns NULL if there are no more contours.
474
475 \fi % }
476
477 \cvCPyFunc{FitEllipse2}
478 Fits an ellipse around a set of 2D points.
479
480 \cvdefC{
481 CvBox2D cvFitEllipse2( \par const CvArr* points );
482 }
483 \cvdefPy{FitEllipse2(points)-> Box2D}
484
485 \begin{description}
486 \cvarg{points}{Sequence or array of points}
487 \end{description}
488
489 The function calculates the ellipse that fits best
490 (in least-squares sense) around a set of 2D points. The meaning of the
491 returned structure fields is similar to those in \cvCPyCross{Ellipse} except
492 that \texttt{size} stores the full lengths of the ellipse axises,
493 not half-lengths.
494
495 \cvCPyFunc{FitLine}
496 Fits a line to a 2D or 3D point set.
497
498 \cvdefC{
499 void  cvFitLine( \par const CvArr* points,\par int dist\_type,\par double param,\par double reps,\par double aeps,\par float* line );
500 }\cvdefPy{FitLine(points, dist\_type, param, reps, aeps) -> line}
501
502 \begin{description}
503 \cvarg{points}{Sequence or array of 2D or 3D points with 32-bit integer or floating-point coordinates}
504 \cvarg{dist\_type}{The distance used for fitting (see the discussion)}
505 \cvarg{param}{Numerical parameter (\texttt{C}) for some types of distances, if 0 then some optimal value is chosen}
506 \cvarg{reps}{Sufficient accuracy for the radius (distance between the coordinate origin and the line).  0.01 is a good default value.}
507 \cvarg{aeps}{Sufficient accuracy for the angle.  0.01 is a good default value.}
508 \cvarg{line}{The output line parameters. In the case of a 2d fitting,
509 it is \cvC{an array} \cvPy{a tuple} of 4 floats \texttt{(vx, vy,
510 x0, y0)} where \texttt{(vx, vy)} is a normalized vector collinear to the
511 line and \texttt{(x0, y0)} is some point on the line. in the case of a
512 3D fitting it is \cvC{an array} \cvPy{a tuple} of 6 floats \texttt{(vx, vy, vz, x0, y0, z0)}
513 where \texttt{(vx, vy, vz)} is a normalized vector collinear to the line
514 and \texttt{(x0, y0, z0)} is some point on the line}
515 \end{description}
516
517 The function fits a line to a 2D or 3D point set by minimizing $\sum_i \rho(r_i)$ where $r_i$ is the distance between the $i$ th point and the line and $\rho(r)$ is a distance function, one of:
518
519 \begin{description}
520
521 \item[dist\_type=CV\_DIST\_L2]
522 \[ \rho(r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)} \]
523
524 \item[dist\_type=CV\_DIST\_L1]
525 \[ \rho(r) = r \]
526
527 \item[dist\_type=CV\_DIST\_L12]
528 \[ \rho(r) = 2 \cdot (\sqrt{1 + \frac{r^2}{2}} - 1) \]
529
530 \item[dist\_type=CV\_DIST\_FAIR]
531 \[ \rho\left(r\right) = C^2 \cdot \left( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)}\right) \quad \text{where} \quad C=1.3998 \]
532
533 \item[dist\_type=CV\_DIST\_WELSCH]
534 \[ \rho\left(r\right) = \frac{C^2}{2} \cdot \left( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)}\right) \quad \text{where} \quad C=2.9846 \]
535
536 \item[dist\_type=CV\_DIST\_HUBER]
537 \[ \rho(r) = \fork
538 {r^2/2}{if $r < C$}
539 {C \cdot (r-C/2)}{otherwise}  \quad \text{where} \quad C=1.345
540 \]
541 \end{description}
542
543 \cvCPyFunc{GetCentralMoment}
544 Retrieves the central moment from the moment state structure.
545
546 \cvdefC{
547 double cvGetCentralMoment( \par CvMoments* moments,\par int x\_order,\par int y\_order );
548 }
549 \cvdefPy{GetCentralMoment(moments, x\_order, y\_order) -> double}
550
551 \begin{description}
552 \cvarg{moments}{Pointer to the moment state structure}
553 \cvarg{x\_order}{x order of the retrieved moment, $\texttt{x\_order} >= 0$}
554 \cvarg{y\_order}{y order of the retrieved moment, $\texttt{y\_order} >= 0$ and $\texttt{x\_order} + \texttt{y\_order} <= 3$}
555 \end{description}
556
557 The function retrieves the central moment, which in the case of image moments is defined as:
558
559 \[
560 \mu_{x\_order, \, y\_order} = \sum_{x,y} (I(x,y) \cdot (x-x_c)^{x\_order} \cdot (y-y_c)^{y\_order})
561 \]
562
563 where $x_c,y_c$ are the coordinates of the gravity center:
564
565 \[
566 x_c=\frac{M_{10}}{M_{00}}, y_c=\frac{M_{01}}{M_{00}}
567 \]
568
569 \cvCPyFunc{GetHuMoments}
570 Calculates the seven Hu invariants.
571
572 \cvdefC{void cvGetHuMoments( const CvMoments* moments,CvHuMoments* hu );}
573 \cvdefPy{GetHuMoments(moments) -> hu}
574
575 \begin{description}
576 \cvarg{moments}{The input moments, computed with \cvCPyCross{Moments}}
577 \cvarg{hu}{The output Hu invariants}
578 \end{description}
579
580 The function calculates the seven Hu invariants, see \url{http://en.wikipedia.org/wiki/Image_moment}, that are defined as:
581
582 \[ \begin{array}{l}
583 hu_1=\eta_{20}+\eta_{02}\\
584 hu_2=(\eta_{20}-\eta_{02})^{2}+4\eta_{11}^{2}\\
585 hu_3=(\eta_{30}-3\eta_{12})^{2}+ (3\eta_{21}-\eta_{03})^{2}\\
586 hu_4=(\eta_{30}+\eta_{12})^{2}+ (\eta_{21}+\eta_{03})^{2}\\
587 hu_5=(\eta_{30}-3\eta_{12})(\eta_{30}+\eta_{12})[(\eta_{30}+\eta_{12})^{2}-3(\eta_{21}+\eta_{03})^{2}]+(3\eta_{21}-\eta_{03})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^{2}-(\eta_{21}+\eta_{03})^{2}]\\
588 hu_6=(\eta_{20}-\eta_{02})[(\eta_{30}+\eta_{12})^{2}- (\eta_{21}+\eta_{03})^{2}]+4\eta_{11}(\eta_{30}+\eta_{12})(\eta_{21}+\eta_{03})\\
589 hu_7=(3\eta_{21}-\eta_{03})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^{2}-(\eta_{21}+\eta_{03})^{2}]-(\eta_{30}-3\eta_{12})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^{2}-(\eta_{21}+\eta_{03})^{2}]\\
590 \end{array}
591 \]
592
593 where $\eta_{ji}$ denote the normalized central moments.
594
595 These values are proved to be invariant to the image scale, rotation, and reflection except the seventh one, whose sign is changed by reflection. Of course, this invariance was proved with the assumption of infinite image resolution. In case of a raster images the computed Hu invariants for the original and transformed images will be a bit different.
596
597
598 \cvCPyFunc{GetNormalizedCentralMoment}
599 Retrieves the normalized central moment from the moment state structure.
600
601 \cvdefC{
602 double cvGetNormalizedCentralMoment( \par CvMoments* moments,\par int x\_order,\par int y\_order );
603 }\cvdefPy{GetNormalizedCentralMoment(moments, x\_order, y\_order) -> double}
604
605 \begin{description}
606 \cvarg{moments}{Pointer to the moment state structure}
607 \cvarg{x\_order}{x order of the retrieved moment, $\texttt{x\_order} >= 0$}
608 \cvarg{y\_order}{y order of the retrieved moment, $\texttt{y\_order} >= 0$ and $\texttt{x\_order} + \texttt{y\_order} <= 3$}
609 \end{description}
610
611 The function retrieves the normalized central moment:
612
613 \[
614 \eta_{x\_order, \, y\_order} = \frac{\mu_{x\_order, \, y\_order}}{M_{00}^{(y\_order+x\_order)/2+1}}
615 \]
616
617 \cvCPyFunc{GetSpatialMoment}
618 Retrieves the spatial moment from the moment state structure.
619
620 \cvdefC{
621 double cvGetSpatialMoment( \par CvMoments* moments, \par int x\_order, \par int y\_order );
622 }
623 \cvdefPy{GetSpatialMoment(moments, x\_order, y\_order) -> double}
624
625 \begin{description}
626 \cvarg{moments}{The moment state, calculated by \cvCPyCross{Moments}}
627 \cvarg{x\_order}{x order of the retrieved moment, $\texttt{x\_order} >= 0$}
628 \cvarg{y\_order}{y order of the retrieved moment, $\texttt{y\_order} >= 0$ and $\texttt{x\_order} + \texttt{y\_order} <= 3$}
629 \end{description}
630
631 The function retrieves the spatial moment, which in the case of image moments is defined as:
632
633 \[
634 M_{x\_order, \, y\_order} = \sum_{x,y} (I(x,y) \cdot x^{x\_order} \cdot y^{y\_order})
635 \]
636
637 where $I(x,y)$ is the intensity of the pixel $(x, y)$.
638
639 \cvCPyFunc{MatchContourTrees}
640 Compares two contours using their tree representations.
641
642 \cvdefC{
643 double cvMatchContourTrees( \par const CvContourTree* tree1,\par const CvContourTree* tree2,\par int method,\par double threshold );
644 }\cvdefPy{MatchContourTrees(tree1,tree2,method,threshold)-> double}
645
646 \begin{description}
647 \cvarg{tree1}{First contour tree}
648 \cvarg{tree2}{Second contour tree}
649 \cvarg{method}{Similarity measure, only \texttt{CV\_CONTOUR\_TREES\_MATCH\_I1} is supported}
650 \cvarg{threshold}{Similarity threshold}
651 \end{description}
652
653 The function calculates the value of the matching measure for two contour trees. The similarity measure is calculated level by level from the binary tree roots. If at a certain level the difference between contours becomes less than \texttt{threshold}, the reconstruction process is interrupted and the current difference is returned.
654
655 \cvCPyFunc{MatchShapes}
656 Compares two shapes.
657
658 \cvdefC{
659 double cvMatchShapes( \par const void* object1,\par const void* object2,\par int method,\par double parameter=0 );
660 }\cvdefPy{MatchShapes(object1,object2,method,parameter=0)-> None}
661
662 \begin{description}
663 \cvarg{object1}{First contour or grayscale image}
664 \cvarg{object2}{Second contour or grayscale image}
665 \cvarg{method}{Comparison method;
666  \texttt{CV\_CONTOUR\_MATCH\_I1}, 
667  \texttt{CV\_CONTOURS\_MATCH\_I2} 
668 or 
669  \texttt{CV\_CONTOURS\_MATCH\_I3}}
670 \cvarg{parameter}{Method-specific parameter (is not used now)}
671 \end{description}
672
673 The function compares two shapes. The 3 implemented methods all use Hu moments (see \cvCPyCross{GetHuMoments}) ($A$ is \texttt{object1}, $B$ is \texttt{object2}):
674
675 \begin{description}
676 \item[method=CV\_CONTOUR\_MATCH\_I1]
677 \[ I_1(A,B) = \sum_{i=1...7} \left| \frac{1}{m^A_i} - \frac{1}{m^B_i} \right| \]
678
679 \item[method=CV\_CONTOUR\_MATCH\_I2]
680 \[ I_2(A,B) = \sum_{i=1...7} \left| m^A_i - m^B_i \right| \]
681
682 \item[method=CV\_CONTOUR\_MATCH\_I3]
683 \[ I_3(A,B) = \sum_{i=1...7} \frac{ \left| m^A_i - m^B_i \right| }{ \left| m^A_i \right| } \]
684 \end{description}
685
686 where
687
688 \[
689 \begin{array}{l}
690 m^A_i = sign(h^A_i) \cdot \log{h^A_i}
691 m^B_i = sign(h^B_i) \cdot \log{h^B_i}
692 \end{array}
693 \]
694
695 and $h^A_i, h^B_i$ are the Hu moments of $A$ and $B$ respectively.
696
697
698 \cvCPyFunc{MinAreaRect2}
699 Finds the circumscribed rectangle of minimal area for a given 2D point set.
700
701 \cvdefC{
702 CvBox2D  cvMinAreaRect2( \par const CvArr* points,\par CvMemStorage* storage=NULL );
703 }\cvdefPy{MinAreaRect2(points,storage=NULL)-> CvBox2D}
704
705 \begin{description}
706 \cvarg{points}{Sequence or array of points}
707 \cvarg{storage}{Optional temporary memory storage}
708 \end{description}
709
710 The function finds a circumscribed rectangle of the minimal area for a 2D point set by building a convex hull for the set and applying the rotating calipers technique to the hull.
711
712 Picture. Minimal-area bounding rectangle for contour
713
714 \includegraphics[width=0.5\textwidth]{pics/minareabox.png}
715
716 \cvCPyFunc{MinEnclosingCircle}
717 Finds the circumscribed circle of minimal area for a given 2D point set.
718
719 \cvdefC{
720 int cvMinEnclosingCircle( \par const CvArr* points,\par CvPoint2D32f* center,\par float* radius );
721 }
722 \cvdefPy{MinEnclosingCircle(points)-> (int,center,radius)}
723
724 \begin{description}
725 \cvarg{points}{Sequence or array of 2D points}
726 \cvarg{center}{Output parameter; the center of the enclosing circle}
727 \cvarg{radius}{Output parameter; the radius of the enclosing circle}
728 \end{description}
729
730 The function finds the minimal circumscribed
731 circle for a 2D point set using an iterative algorithm. It returns nonzero
732 if the resultant circle contains all the input points and zero otherwise
733 (i.e. the algorithm failed).
734
735 \cvCPyFunc{Moments}
736 Calculates all of the moments up to the third order of a polygon or rasterized shape.
737
738 \cvdefC{
739 void cvMoments( \par const CvArr* arr,\par CvMoments* moments,\par int binary=0 );
740 }
741 \cvdefPy{Moments(arr, binary) -> moments}
742
743 \begin{description}
744 \cvarg{arr}{Image (1-channel or 3-channel with COI set) or polygon (CvSeq of points or a vector of points)}
745 \cvarg{moments}{Pointer to returned moment's state structure}
746 \cvarg{binary}{(For images only) If the flag is non-zero, all of the zero pixel values are treated as zeroes, and all of the others are treated as 1's}
747 \end{description}
748
749 The function calculates spatial and central moments up to the third order and writes them to \texttt{moments}. The moments may then be used then to calculate the gravity center of the shape, its area, main axises and various shape characeteristics including 7 Hu invariants.
750
751 \cvCPyFunc{PointPolygonTest}
752 Point in contour test.
753
754 \cvdefC{
755 double cvPointPolygonTest( \par const CvArr* contour,\par CvPoint2D32f pt,\par int measure\_dist );
756 }\cvdefPy{PointPolygonTest(contour,pt,measure\_dist)-> double}
757
758 \begin{description}
759 \cvarg{contour}{Input contour}
760 \cvarg{pt}{The point tested against the contour}
761 \cvarg{measure\_dist}{If it is non-zero, the function estimates the distance from the point to the nearest contour edge}
762 \end{description}
763
764 The function determines whether the
765 point is inside a contour, outside, or lies on an edge (or coinsides
766 with a vertex). It returns positive, negative or zero value,
767 correspondingly. When $\texttt{measure\_dist} =0$, the return value
768 is +1, -1 and 0, respectively. When $\texttt{measure\_dist} \ne 0$,
769 it is a signed distance between the point and the nearest contour
770 edge.
771
772 Here is the sample output of the function, where each image pixel is tested against the contour.
773
774 \includegraphics[width=0.5\textwidth]{pics/pointpolygon.png}
775
776 \ifC
777
778 \cvCPyFunc{PointSeqFromMat}
779 Initializes a point sequence header from a point vector.
780
781 \cvdefC{
782 CvSeq* cvPointSeqFromMat( \par int seq\_kind,\par const CvArr* mat,\par CvContour* contour\_header,\par CvSeqBlock* block );
783 }
784
785 \begin{description}
786 \cvarg{seq\_kind}{Type of the point sequence: point set (0), a curve (\texttt{CV\_SEQ\_KIND\_CURVE}), closed curve (\texttt{CV\_SEQ\_KIND\_CURVE+CV\_SEQ\_FLAG\_CLOSED}) etc.}
787 \cvarg{mat}{Input matrix. It should be a continuous, 1-dimensional vector of points, that is, it should have type \texttt{CV\_32SC2} or \texttt{CV\_32FC2}}
788 \cvarg{contour\_header}{Contour header, initialized by the function}
789 \cvarg{block}{Sequence block header, initialized by the function}
790 \end{description}
791
792 The function initializes a sequence
793 header to create a "virtual" sequence in which elements reside in
794 the specified matrix. No data is copied. The initialized sequence
795 header may be passed to any function that takes a point sequence
796 on input. No extra elements can be added to the sequence,
797 but some may be removed. The function is a specialized variant of
798 \cvCPyCross{MakeSeqHeaderForArray} and uses
799 the latter internally. It returns a pointer to the initialized contour
800 header. Note that the bounding rectangle (field \texttt{rect} of
801 \texttt{CvContour} strucuture) is not initialized by the function. If
802 you need one, use \cvCPyCross{BoundingRect}.
803
804 Here is a simple usage example.
805
806 \begin{lstlisting}
807 CvContour header;
808 CvSeqBlock block;
809 CvMat* vector = cvCreateMat( 1, 3, CV_32SC2 );
810
811 CV_MAT_ELEM( *vector, CvPoint, 0, 0 ) = cvPoint(100,100);
812 CV_MAT_ELEM( *vector, CvPoint, 0, 1 ) = cvPoint(100,200);
813 CV_MAT_ELEM( *vector, CvPoint, 0, 2 ) = cvPoint(200,100);
814
815 IplImage* img = cvCreateImage( cvSize(300,300), 8, 3 );
816 cvZero(img);
817
818 cvDrawContours( img,
819     cvPointSeqFromMat(CV_SEQ_KIND_CURVE+CV_SEQ_FLAG_CLOSED,
820                       vector,
821                       &header,
822                       &block),
823                 CV_RGB(255,0,0),
824                 CV_RGB(255,0,0),
825                 0, 3, 8, cvPoint(0,0));
826 \end{lstlisting}
827
828
829 \cvCPyFunc{ReadChainPoint}
830 Gets the next chain point.
831
832 \cvdefC{
833 CvPoint cvReadChainPoint( CvChainPtReader* reader );
834 }
835
836 \begin{description}
837 \cvarg{reader}{Chain reader state}
838 \end{description}
839
840 The function returns the current chain point and updates the reader position.
841
842 \cvCPyFunc{StartFindContours}
843 Initializes the contour scanning process.
844
845 \cvdefC{
846 CvContourScanner cvStartFindContours(\par CvArr* image,\par CvMemStorage* storage,\par
847                                       int header\_size=sizeof(CvContour),\par
848                                       int mode=CV\_RETR\_LIST,\par
849                                       int method=CV\_CHAIN\_APPROX\_SIMPLE,\par
850                                       CvPoint offset=cvPoint(0,\par0) );
851 }
852
853 \begin{description}
854 \cvarg{image}{The 8-bit, single channel, binary source image}
855 \cvarg{storage}{Container of the retrieved contours}
856 \cvarg{header\_size}{Size of the sequence header, $>=sizeof(CvChain)$ if \texttt{method} =CV\_CHAIN\_CODE, and $>=sizeof(CvContour)$ otherwise}
857 \cvarg{mode}{Retrieval mode; see \cvCPyCross{FindContours}}
858 \cvarg{method}{Approximation method. It has the same meaning in \cvCPyCross{FindContours}, but \texttt{CV\_LINK\_RUNS} can not be used here}
859 \cvarg{offset}{ROI offset; see \cvCPyCross{FindContours}}
860 \end{description}
861
862 The function initializes and returns a pointer to the contour scanner. The scanner is used in \cvCPyCross{FindNextContour} to retrieve the rest of the contours.
863
864 \cvCPyFunc{StartReadChainPoints}
865 Initializes the chain reader.
866
867 \cvdefC{
868 void cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );
869 }
870
871 The function initializes a special reader.
872
873 \cvCPyFunc{SubstituteContour}
874 Replaces a retrieved contour.
875
876 \cvdefC{
877 void cvSubstituteContour( \par CvContourScanner scanner, \par CvSeq* new\_contour );
878 }
879
880 \begin{description}
881 \cvarg{scanner}{Contour scanner initialized by \cvCPyCross{StartFindContours} }
882 \cvarg{new\_contour}{Substituting contour}
883 \end{description}
884
885 The function replaces the retrieved
886 contour, that was returned from the preceding call of
887 \cvCPyCross{FindNextContour} and stored inside the contour scanner
888 state, with the user-specified contour. The contour is inserted
889 into the resulting structure, list, two-level hierarchy, or tree,
890 depending on the retrieval mode. If the parameter \texttt{new\_contour}
891 is \texttt{NULL}, the retrieved contour is not included in the
892 resulting structure, nor are any of its children that might be added
893 to this structure later.
894
895 \fi
896
897 \fi
898
899
900 \ifCpp
901
902 \cvCppFunc{moments}
903 Calculates all of the moments up to the third order of a polygon or rasterized shape.
904
905 \cvdefCpp{Moments moments( const Mat\& array, bool binaryImage=false );}
906
907 where the class \texttt{Moments} is defined as:
908 \begin{lstlisting}
909 class Moments
910 {
911 public:
912     Moments();
913     Moments(double m00, double m10, double m01, double m20, double m11,
914             double m02, double m30, double m21, double m12, double m03 );
915     Moments( const CvMoments\& moments );
916     operator CvMoments() const;
917     
918     // spatial moments
919     double  m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
920     // central moments
921     double  mu20, mu11, mu02, mu30, mu21, mu12, mu03;
922     // central normalized moments
923     double  nu20, nu11, nu02, nu30, nu21, nu12, nu03;
924 };
925 \end{lstlisting}
926
927 \begin{description}
928 \cvarg{array}{A raster image (single-channel, 8-bit or floating-point 2D array) or an array
929     ($1 \times N$ or $N \times 1$) of 2D points (\texttt{Point} or \texttt{Point2f})}
930 \cvarg{binaryImage}{(For images only) If it is true, then all the non-zero image pixels are treated as 1's}
931 \end{description}
932
933 The function computes moments, up to the 3rd order, of a vector shape or a rasterized shape.
934 In case of a raster image, the spatial moments $\texttt{Moments::m}_{ji}$ are computed as:
935
936 \[\texttt{m}_{ji}=\sum_{x,y} \left(\texttt{array}(x,y) \cdot x^j \cdot y^i\right),\]
937
938 the central moments $\texttt{Moments::mu}_{ji}$ are computed as:
939 \[\texttt{mu}_{ji}=\sum_{x,y} \left(\texttt{array}(x,y) \cdot (x - \bar{x})^j \cdot (y - \bar{y})^i\right)\]
940 where $(\bar{x}, \bar{y})$ is the mass center:
941
942 \[
943 \bar{x}=\frac{\texttt{m}_{10}}{\texttt{m}_{00}},\; \bar{y}=\frac{\texttt{m}_{01}}{\texttt{m}_{00}}
944 \]
945
946 and the normalized central moments $\texttt{Moments::nu}_{ij}$ are computed as:
947 \[\texttt{nu}_{ji}=\frac{\texttt{mu}_{ji}}{\texttt{m}_{00}^{(i+j)/2+1}}.\]
948
949 Note that $\texttt{mu}_{00}=\texttt{m}_{00}$, $\texttt{nu}_{00}=1$ $\texttt{nu}_{10}=\texttt{mu}_{10}=\texttt{mu}_{01}=\texttt{mu}_{10}=0$, hence the values are not stored.
950
951 The moments of a contour are defined in the same way, but computed using Green's formula
952 (see \url{http://en.wikipedia.org/wiki/Green_theorem}), therefore, because of a limited raster resolution, the moments computed for a contour will be slightly different from the moments computed for the same contour rasterized.
953
954 See also: \cvCppCross{contourArea}, \cvCppCross{arcLength}
955
956 \cvCppFunc{HuMoments}
957 Calculates the seven Hu invariants.
958
959 \cvdefCpp{void HuMoments( const Moments\& moments, double h[7] );}
960 \begin{description}
961 \cvarg{moments}{The input moments, computed with \cvCppCross{moments}}
962 \cvarg{h}{The output Hu invariants}
963 \end{description}
964
965 The function calculates the seven Hu invariants, see \url{http://en.wikipedia.org/wiki/Image_moment}, that are defined as:
966
967 \[ \begin{array}{l}
968 h[0]=\eta_{20}+\eta_{02}\\
969 h[1]=(\eta_{20}-\eta_{02})^{2}+4\eta_{11}^{2}\\
970 h[2]=(\eta_{30}-3\eta_{12})^{2}+ (3\eta_{21}-\eta_{03})^{2}\\
971 h[3]=(\eta_{30}+\eta_{12})^{2}+ (\eta_{21}+\eta_{03})^{2}\\
972 h[4]=(\eta_{30}-3\eta_{12})(\eta_{30}+\eta_{12})[(\eta_{30}+\eta_{12})^{2}-3(\eta_{21}+\eta_{03})^{2}]+(3\eta_{21}-\eta_{03})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^{2}-(\eta_{21}+\eta_{03})^{2}]\\
973 h[5]=(\eta_{20}-\eta_{02})[(\eta_{30}+\eta_{12})^{2}- (\eta_{21}+\eta_{03})^{2}]+4\eta_{11}(\eta_{30}+\eta_{12})(\eta_{21}+\eta_{03})\\
974 h[6]=(3\eta_{21}-\eta_{03})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^{2}-(\eta_{21}+\eta_{03})^{2}]-(\eta_{30}-3\eta_{12})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^{2}-(\eta_{21}+\eta_{03})^{2}]\\
975 \end{array}
976 \]
977
978 where $\eta_{ji}$ stand for $\texttt{Moments::nu}_{ji}$.
979
980 These values are proved to be invariant to the image scale, rotation, and reflection except the seventh one, whose sign is changed by reflection. Of course, this invariance was proved with the assumption of infinite image resolution. In case of a raster images the computed Hu invariants for the original and transformed images will be a bit different.
981
982 See also: \cvCppCross{matchShapes}
983
984 \cvCppFunc{findContours}
985 Finds the contours in a binary image.
986
987 \cvdefCpp{void findContours( const Mat\& image, vector<vector<Point> >\& contours,\par
988                    vector<Vec4i>\& hierarchy, int mode,\par
989                    int method, Point offset=Point());\newline
990 void findContours( const Mat\& image, vector<vector<Point> >\& contours,\par
991                    int mode, int method, Point offset=Point());
992 }
993 \begin{description}
994 \cvarg{image}{The source, an 8-bit single-channel image. Non-zero pixels are treated as 1's, zero pixels remain 0's - the image is treated as \texttt{binary}. You can use \cvCppCross{compare}, \cvCppCross{inRange}, \cvCppCross{threshold}, \cvCppCross{adaptiveThreshold}, \cvCppCross{Canny} etc. to create a binary image out of a grayscale or color one. The function modifies the \texttt{image} while extracting the contours}
995 \cvarg{contours}{The detected contours. Each contour is stored as a vector of points}
996 \cvarg{hiararchy}{The optional output vector that will contain information about the image topology. It will have as many elements as the number of contours. For each contour \texttt{contours[i]}, the elements \texttt{hierarchy[i][0]}, \texttt{hiearchy[i][1]}, \texttt{hiearchy[i][2]}, \texttt{hiearchy[i][3]} will be set to 0-based indices in \texttt{contours} of the next and previous contours at the same hierarchical level, the first child contour and the parent contour, respectively. If for some contour \texttt{i} there is no next, previous, parent or nested contours, the corresponding elements of \texttt{hierarchy[i]} will be negative}
997 \cvarg{mode}{The contour retrieval mode
998 \begin{description}
999   \cvarg{CV\_RETR\_EXTERNAL}{retrieves only the extreme outer contours; It will set \texttt{hierarchy[i][2]=hierarchy[i][3]=-1} for all the contours}
1000   \cvarg{CV\_RETR\_LIST}{retrieves all of the contours without establishing any hierarchical relationships}
1001   \cvarg{CV\_RETR\_CCOMP}{retrieves all of the contours and organizes them into a two-level hierarchy: on the top level are the external boundaries of the components, on the second level are the boundaries of the holes. If inside a hole of a connected component there is another contour, it will still be put on the top level}
1002   \cvarg{CV\_RETR\_TREE}{retrieves all of the contours and reconstructs the full hierarchy of nested contours. This full hierarchy is built and shown in OpenCV \texttt{contours.c} demo}
1003 \end{description}}
1004 \cvarg{method}{The contour approximation method.
1005 \begin{description}
1006   \cvarg{CV\_CHAIN\_APPROX\_NONE}{stores absolutely all the contour points. That is, every 2 points of a contour stored with this method are 8-connected neighbors of each other}
1007   \cvarg{CV\_CHAIN\_APPROX\_SIMPLE}{compresses horizontal, vertical, and diagonal segments and leaves only their end points. E.g. an up-right rectangular contour will be encoded with 4 points}
1008   \cvarg{CV\_CHAIN\_APPROX\_TC89\_L1,CV\_CHAIN\_APPROX\_TC89\_KCOS}{applies one of the flavors of the Teh-Chin chain approximation algorithm; see \cite{TehChin89}}
1009 \end{description}}
1010 \cvarg{offset}{The optional offset, by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context}
1011 \end{description}
1012
1013 The function retrieves contours from the
1014 binary image using the algorithm \cite{Suzuki85}. The contours are a useful tool for shape analysis and object detection and recognition. See \texttt{squares.c} in the OpenCV sample directory.
1015
1016 \cvCppFunc{drawContours}
1017 Draws contours' outlines or filled contours.
1018
1019 \cvdefCpp{void drawContours( Mat\& image, const vector<vector<Point> >\& contours,\par
1020                    int contourIdx, const Scalar\& color, int thickness=1,\par
1021                    int lineType=8, const vector<Vec4i>\& hierarchy=vector<Vec4i>(),\par
1022                    int maxLevel=INT\_MAX, Point offset=Point() );}
1023 \begin{description}
1024 \cvarg{image}{The destination image}
1025 \cvarg{contours}{All the input contours. Each contour is stored as a point vector}
1026 \cvarg{contourIdx}{Indicates the contour to draw. If it is negative, all the contours are drawn}
1027 \cvarg{color}{The contours' color}
1028 \cvarg{thickness}{Thickness of lines the contours are drawn with.
1029 If it is negative (e.g. \texttt{thickness=CV\_FILLED}), the contour interiors are
1030 drawn.}
1031 \cvarg{lineType}{The line connectivity; see \cvCppCross{line} description}
1032 \cvarg{hierarchy}{The optional information about hierarchy. It is only needed if you want to draw only some of the  contours (see \texttt{maxLevel})}
1033 \cvarg{maxLevel}{Maximal level for drawn contours. If 0, only
1034 the specified contour is drawn. If 1, the function draws the contour(s) and all the nested contours. If 2, the function draws the contours, all the nested contours and all the nested into nested contours etc. This parameter is only taken into account when there is \texttt{hierarchy} available.}
1035 \cvarg{offset}{The optional contour shift parameter. Shift all the drawn contours by the specified $\texttt{offset}=(dx,dy)$}
1036 \end{description}
1037
1038 The function draws contour outlines in the image if $\texttt{thickness} \ge 0$ or fills the area bounded by the contours if $ \texttt{thickness}<0$. Here is the example on how to retrieve connected components from the binary image and label them
1039
1040 \begin{lstlisting}
1041 #include "cv.h"
1042 #include "highgui.h"
1043
1044 using namespace cv;
1045
1046 int main( int argc, char** argv )
1047 {
1048     Mat src;
1049     // the first command line parameter must be file name of binary 
1050     // (black-n-white) image
1051     if( argc != 2 || !(src=imread(argv[1], 0)).data)
1052         return -1;
1053
1054     Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);
1055
1056     src = src > 1;
1057     namedWindow( "Source", 1 );
1058     imshow( "Source", src );
1059
1060     vector<vector<Point> > contours;
1061     vector<Vec4i> hierarchy;
1062     
1063     findContours( src, contours, hierarchy, 
1064         CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
1065
1066     // iterate through all the top-level contours,
1067     // draw each connected component with its own random color
1068     int idx = 0;
1069     for( ; idx >= 0; idx = hiearchy[idx][0] )
1070     {
1071         Scalar color( rand()&255, rand()&255, rand()&255 );
1072         drawContours( dst, contours, idx, color, CV_FILLED, 8, hiearchy );
1073     }
1074
1075     namedWindow( "Components", 1 );
1076     imshow( "Components", dst );
1077     waitKey(0);
1078 }
1079 \end{lstlisting}
1080
1081
1082 \cvCppFunc{approxPolyDP}
1083 Approximates polygonal curve(s) with the specified precision.
1084
1085 \cvdefCpp{void approxPolyDP( const Mat\& curve,\par
1086                    vector<Point>\& approxCurve,\par
1087                    double epsilon, bool closed );\newline
1088 void approxPolyDP( const Mat\& curve,\par
1089                    vector<Point2f>\& approxCurve,\par
1090                    double epsilon, bool closed );}
1091 \begin{description}
1092 \cvarg{curve}{The polygon or curve to approximate. Must be $1 \times N$ or $N \times 1$ matrix of type \texttt{CV\_32SC2} or \texttt{CV\_32FC2}. You can also convert \texttt{vector<Point>} or \texttt{vector<Point2f} to the matrix by calling \texttt{Mat(const vector<T>\&)} constructor.}
1093 \cvarg{approxCurve}{The result of the approximation; The type should match the type of the input curve}
1094 \cvarg{epsilon}{Specifies the approximation accuracy. This is the maximum distance between the original curve and its approximation}
1095 \cvarg{closed}{If true, the approximated curve is closed (i.e. its first and last vertices are connected), otherwise it's not}
1096 \end{description}
1097
1098 The functions \texttt{approxPolyDP} approximate a curve or a polygon with another curve/polygon with less vertices, so that the distance between them is less or equal to the specified precision. It used Douglas-Peucker algorithm \url{http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm}
1099
1100 \cvCppFunc{arcLength}
1101 Calculates a contour perimeter or a curve length.
1102
1103 \cvdefCpp{double arcLength( const Mat\& curve, bool closed );}
1104 \begin{description}
1105 \cvarg{curve}{The input vector of 2D points, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to a matrix with \texttt{Mat(const vector<T>\&)} constructor}
1106 \cvarg{closed}{Indicates, whether the curve is closed or not}
1107 \end{description}
1108
1109 The function computes the curve length or the closed contour perimeter.
1110
1111 \cvCppFunc{boundingRect}
1112 Calculates the up-right bounding rectangle of a point set.
1113
1114 \cvdefCpp{Rect boundingRect( const Mat\& points );}
1115 \begin{description}
1116 \cvarg{points}{The input 2D point set, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1117 \end{description}
1118
1119 The function calculates and returns the minimal up-right bounding rectangle for the specified point set.
1120
1121
1122 \cvCppFunc{estimateRigidTransform}
1123 Computes optimal affine transformation between two 2D point sets
1124
1125 \cvdefCpp{Mat estimateRigidTransform( const Mat\& srcpt, const Mat\& dstpt,\par
1126                             bool fullAffine );}
1127 \begin{description}
1128 \cvarg{srcpt}{The first input 2D point set}
1129 \cvarg{dst}{The second input 2D point set of the same size and the same type as \texttt{A}}
1130 \cvarg{fullAffine}{If true, the function finds the optimal affine transformation with no any additional resrictions (i.e. there are 6 degrees of freedom); otherwise, the class of transformations to choose from is limited to combinations of translation, rotation and uniform scaling (i.e. there are 5 degrees of freedom)}
1131 \end{description}
1132
1133 The function finds the optimal affine transform $[A|b]$ (a $2 \times 3$ floating-point matrix) that approximates best the transformation from $\texttt{srcpt}_i$ to $\texttt{dstpt}_i$:
1134
1135 \[ [A^*|b^*] = arg \min_{[A|b]} \sum_i \|\texttt{dstpt}_i - A {\texttt{srcpt}_i}^T - b \|^2 \]
1136
1137 where $[A|b]$ can be either arbitrary (when \texttt{fullAffine=true}) or have form
1138 \[\begin{bmatrix}a_{11} & a_{12} & b_1 \\ -a_{12} & a_{11} & b_2 \end{bmatrix}\] when \texttt{fullAffine=false}.
1139
1140 See also: \cvCppCross{getAffineTransform}, \cvCppCross{getPerspectiveTransform}, \cvCppCross{findHomography}
1141
1142 \cvCppFunc{estimateAffine3D}
1143 Computes optimal affine transformation between two 3D point sets
1144
1145 \cvdefCpp{int estimateAffine3D(const Mat\& srcpt, const Mat\& dstpt, Mat\& out,\par
1146                      vector<uchar>\& outliers,\par
1147                      double ransacThreshold = 3.0,\par
1148                      double confidence = 0.99);}
1149 \begin{description}
1150 \cvarg{srcpt}{The first input 3D point set}
1151 \cvarg{dstpt}{The second input 3D point set}
1152 \cvarg{out}{The output 3D affine transformation matrix $3 \times 4$}
1153 \cvarg{outliers}{The output vector indicating which points are outliers}
1154 \cvarg{ransacThreshold}{The maximum reprojection error in RANSAC algorithm to consider a point an inlier}
1155 \cvarg{confidence}{The confidence level, between 0 and 1, with which the matrix is estimated}
1156 \end{description}
1157
1158 The function estimates the optimal 3D affine transformation between two 3D point sets using RANSAC algorithm.
1159
1160
1161 \cvCppFunc{contourArea}
1162 Calculates the contour area
1163
1164 \cvdefCpp{double contourArea( const Mat\& contour );    }
1165 \begin{description}
1166 \cvarg{contour}{The contour vertices, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1167 \end{description}
1168
1169 The function computes the contour area. Similarly to \cvCppCross{moments} the area is computed using the Green formula, thus the returned area and the number of non-zero pixels, if you draw the contour using \cvCppCross{drawContours} or \cvCppCross{fillPoly}, can be different.
1170 Here is a short example:
1171
1172 \begin{lstlisting}
1173 vector<Point> contour;
1174 contour.push_back(Point2f(0, 0));
1175 contour.push_back(Point2f(10, 0));
1176 contour.push_back(Point2f(10, 10));
1177 contour.push_back(Point2f(5, 4));
1178
1179 double area0 = contourArea(contour);
1180 vector<Point> approx;
1181 approxPolyDP(contour, approx, 5, true);
1182 double area1 = contourArea(approx);
1183
1184 cout << "area0 =" << area0 << endl <<
1185         "area1 =" << area1 << endl <<
1186         "approx poly vertices" << approx.size() << endl; 
1187 \end{lstlisting}
1188
1189 \cvCppFunc{convexHull}    
1190 Finds the convex hull of a point set.
1191
1192 \cvdefCpp{void convexHull( const Mat\& points, vector<int>\& hull,\par
1193                  bool clockwise=false );\newline
1194 void convexHull( const Mat\& points, vector<Point>\& hull,\par
1195                  bool clockwise=false );\newline
1196 void convexHull( const Mat\& points, vector<Point2f>\& hull,\par
1197                  bool clockwise=false );}
1198 \begin{description}
1199 \cvarg{points}{The input 2D point set, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1200 \cvarg{hull}{The output convex hull. It is either a vector of points that form the hull, or a vector of 0-based point indices of the hull points in the original array (since the set of convex hull points is a subset of the original point set).}
1201 \cvarg{clockwise}{If true, the output convex hull will be oriented clockwise, otherwise it will be oriented counter-clockwise. Here, the usual screen coordinate system is assumed - the origin is at the top-left corner, x axis is oriented to the right, and y axis is oriented downwards.}
1202 \end{description}
1203
1204 The functions find the convex hull of a 2D point set using Sklansky's algorithm \cite{Sklansky82} that has $O(N logN)$ or $O(N)$ complexity (where $N$ is the number of input points), depending on how the initial sorting is implemented (currently it is $O(N logN)$. See the OpenCV sample \texttt{convexhull.c} that demonstrates the use of the different function variants. 
1205
1206
1207 \cvCppFunc{fitEllipse}
1208 Fits an ellipse around a set of 2D points.
1209
1210 \cvdefCpp{RotatedRect fitEllipse( const Mat\& points );}
1211 \begin{description}
1212 \cvarg{points}{The input 2D point set, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1213 \end{description}
1214
1215 The function calculates the ellipse that fits best
1216 (in least-squares sense) a set of 2D points. It returns the rotated rectangle in which the ellipse is inscribed.
1217
1218 \cvCppFunc{fitLine}
1219 Fits a line to a 2D or 3D point set.
1220
1221 \cvdefCpp{void fitLine( const Mat\& points, Vec4f\& line, int distType,\par
1222               double param, double reps, double aeps );\newline
1223 void fitLine( const Mat\& points, Vec6f\& line, int distType,\par
1224               double param, double reps, double aeps );}
1225 \begin{description}
1226 \cvarg{points}{The input 2D point set, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by
1227 \texttt{vector<Point>}, \texttt{vector<Point2f>}, \texttt{vector<Point3i>} or \texttt{vector<Point3f>} converted to the matrix by \texttt{Mat(const vector<T>\&)} constructor}
1228 \cvarg{line}{The output line parameters. In the case of a 2d fitting,
1229 it is a vector of 4 floats \texttt{(vx, vy,
1230 x0, y0)} where \texttt{(vx, vy)} is a normalized vector collinear to the
1231 line and \texttt{(x0, y0)} is some point on the line. in the case of a
1232 3D fitting it is vector of 6 floats \texttt{(vx, vy, vz, x0, y0, z0)}
1233 where \texttt{(vx, vy, vz)} is a normalized vector collinear to the line
1234 and \texttt{(x0, y0, z0)} is some point on the line}
1235 \cvarg{distType}{The distance used by the M-estimator (see the discussion)}
1236 \cvarg{param}{Numerical parameter (\texttt{C}) for some types of distances, if 0 then some optimal value is chosen}
1237 \cvarg{reps, aeps}{Sufficient accuracy for the radius (distance between the coordinate origin and the line) and angle, respectively; 0.01 would be a good default value for both.}
1238 \end{description}
1239
1240 The functions \texttt{fitLine} fit a line to a 2D or 3D point set by minimizing $\sum_i \rho(r_i)$ where $r_i$ is the distance between the $i^{th}$ point and the line and $\rho(r)$ is a distance function, one of:
1241
1242 \begin{description}
1243 \item[distType=CV\_DIST\_L2]
1244 \[ \rho(r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)} \]
1245
1246 \item[distType=CV\_DIST\_L1]
1247 \[ \rho(r) = r \]
1248
1249 \item[distType=CV\_DIST\_L12]
1250 \[ \rho(r) = 2 \cdot (\sqrt{1 + \frac{r^2}{2}} - 1) \]
1251
1252 \item[distType=CV\_DIST\_FAIR]
1253 \[ \rho\left(r\right) = C^2 \cdot \left( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)}\right) \quad \text{where} \quad C=1.3998 \]
1254
1255 \item[distType=CV\_DIST\_WELSCH]
1256 \[ \rho\left(r\right) = \frac{C^2}{2} \cdot \left( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)}\right) \quad \text{where} \quad C=2.9846 \]
1257
1258 \item[distType=CV\_DIST\_HUBER]
1259 \[ \rho(r) = \fork
1260 {r^2/2}{if $r < C$}
1261 {C \cdot (r-C/2)}{otherwise}  \quad \text{where} \quad C=1.345
1262 \]
1263 \end{description}
1264
1265 The algorithm is based on the M-estimator (\url{http://en.wikipedia.org/wiki/M-estimator}) technique, that iteratively fits the line using weighted least-squares algorithm and after each iteration the weights $w_i$ are adjusted to beinversely proportional to $\rho(r_i)$. 
1266
1267
1268 \cvCppFunc{isContourConvex}
1269 Tests contour convexity.
1270
1271 \cvdefCpp{bool isContourConvex( const Mat\& contour );}
1272 \begin{description}
1273 \cvarg{contour}{The tested contour, a matrix of type \texttt{CV\_32SC2} or \texttt{CV\_32FC2}, or \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1274 \end{description}
1275
1276 The function tests whether the input contour is convex or not. The contour must be simple, i.e. without self-intersections, otherwise the function output is undefined.
1277
1278
1279 \cvCppFunc{minAreaRect}
1280 Finds the minimum area rotated rectangle enclosing a 2D point set.
1281
1282 \cvdefCpp{RotatedRect minAreaRect( const Mat\& points );}
1283 \begin{description}
1284 \cvarg{points}{The input 2D point set, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1285 \end{description}
1286
1287 The function calculates and returns the minimum area bounding rectangle (possibly rotated) for the specified point set. See the OpenCV sample \texttt{minarea.c}
1288
1289 \cvCppFunc{minEnclosingCircle}
1290 Finds the minimum area circle enclosing a 2D point set.
1291
1292 \cvdefCpp{void minEnclosingCircle( const Mat\& points, Point2f\& center, float\& radius );    }
1293 \begin{description}
1294 \cvarg{points}{The input 2D point set, represented by \texttt{CV\_32SC2} or \texttt{CV\_32FC2} matrix, or by \texttt{vector<Point>} or \texttt{vector<Point2f>} converted to the matrix using \texttt{Mat(const vector<T>\&)} constructor.}
1295 \cvarg{center}{The output center of the circle}
1296 \cvarg{radius}{The output radius of the circle}
1297 \end{description}
1298
1299 The function finds the minimal enclosing circle of a 2D point set using iterative algorithm. See the OpenCV sample \texttt{minarea.c}
1300
1301 \cvCppFunc{matchShapes}
1302 Compares two shapes.
1303
1304 \cvdefCpp{double matchShapes( const Mat\& object1,\par
1305                     const Mat\& object2,\par
1306                     int method, double parameter=0 );}
1307 \begin{description}
1308 \cvarg{object1}{The first contour or grayscale image}
1309 \cvarg{object2}{The second contour or grayscale image}
1310 \cvarg{method}{Comparison method:
1311  \texttt{CV\_CONTOUR\_MATCH\_I1},\\ 
1312  \texttt{CV\_CONTOURS\_MATCH\_I2}\\ 
1313 or 
1314  \texttt{CV\_CONTOURS\_MATCH\_I3} (see the discussion below)}
1315 \cvarg{parameter}{Method-specific parameter (is not used now)}
1316 \end{description}
1317
1318 The function compares two shapes. The 3 implemented methods all use Hu invariants (see \cvCppCross{HuMoments}) as following ($A$ denotes \texttt{object1}, $B$ denotes \texttt{object2}):
1319
1320 \begin{description}
1321 \item[method=CV\_CONTOUR\_MATCH\_I1]
1322 \[ I_1(A,B) = \sum_{i=1...7} \left| \frac{1}{m^A_i} - \frac{1}{m^B_i} \right| \]
1323
1324 \item[method=CV\_CONTOUR\_MATCH\_I2]
1325 \[ I_2(A,B) = \sum_{i=1...7} \left| m^A_i - m^B_i \right| \]
1326
1327 \item[method=CV\_CONTOUR\_MATCH\_I3]
1328 \[ I_3(A,B) = \sum_{i=1...7} \frac{ \left| m^A_i - m^B_i \right| }{ \left| m^A_i \right| } \]
1329 \end{description}
1330
1331 where
1332
1333 \[
1334 \begin{array}{l}
1335 m^A_i = \mathrm{sign}(h^A_i) \cdot \log{h^A_i} \\
1336 m^B_i = \mathrm{sign}(h^B_i) \cdot \log{h^B_i}
1337 \end{array}
1338 \]
1339
1340 and $h^A_i, h^B_i$ are the Hu moments of $A$ and $B$ respectively.
1341
1342
1343 \cvCppFunc{pointPolygonTest}
1344 Performs point-in-contour test.
1345
1346 \cvdefCpp{double pointPolygonTest( const Mat\& contour,\par
1347                          Point2f pt, bool measureDist );}
1348 \begin{description}
1349 \cvarg{contour}{The input contour}
1350 \cvarg{pt}{The point tested against the contour}
1351 \cvarg{measureDist}{If true, the function estimates the signed distance from the point to the nearest contour edge; otherwise, the function only checks if the point is inside or not.}
1352 \end{description}
1353
1354 The function determines whether the
1355 point is inside a contour, outside, or lies on an edge (or coincides
1356 with a vertex). It returns positive (inside), negative (outside) or zero (on an edge) value,
1357 correspondingly. When \texttt{measureDist=false}, the return value
1358 is +1, -1 and 0, respectively. Otherwise, the return value
1359 it is a signed distance between the point and the nearest contour
1360 edge.
1361
1362 Here is the sample output of the function, where each image pixel is tested against the contour.
1363
1364 \includegraphics[width=0.5\textwidth]{pics/pointpolygon.png}
1365
1366 \fi