Home | History | Annotate | Download | only in include
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                        Intel License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
     14 // Third party copyrights are property of their respective owners.
     15 //
     16 // Redistribution and use in source and binary forms, with or without modification,
     17 // are permitted provided that the following conditions are met:
     18 //
     19 //   * Redistribution's of source code must retain the above copyright notice,
     20 //     this list of conditions and the following disclaimer.
     21 //
     22 //   * Redistribution's in binary form must reproduce the above copyright notice,
     23 //     this list of conditions and the following disclaimer in the documentation
     24 //     and/or other materials provided with the distribution.
     25 //
     26 //   * The name of Intel Corporation may not be used to endorse or promote products
     27 //     derived from this software without specific prior written permission.
     28 //
     29 // This software is provided by the copyright holders and contributors "as is" and
     30 // any express or implied warranties, including, but not limited to, the implied
     31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     32 // In no event shall the Intel Corporation or contributors be liable for any direct,
     33 // indirect, incidental, special, exemplary, or consequential damages
     34 // (including, but not limited to, procurement of substitute goods or services;
     35 // loss of use, data, or profits; or business interruption) however caused
     36 // and on any theory of liability, whether in contract, strict liability,
     37 // or tort (including negligence or otherwise) arising in any way out of
     38 // the use of this software, even if advised of the possibility of such damage.
     39 //
     40 //M*/
     41 
     42 
     43 #ifndef _CV_H_
     44 #define _CV_H_
     45 
     46 #ifdef __IPL_H__
     47 #define HAVE_IPL
     48 #endif
     49 
     50 #ifndef SKIP_INCLUDES
     51   #if defined(_CH_)
     52     #pragma package <chopencv>
     53     #include <chdl.h>
     54     LOAD_CHDL(cv)
     55   #endif
     56 #endif
     57 
     58 #include "cxcore.h"
     59 #include "cvtypes.h"
     60 
     61 #ifdef __cplusplus
     62 extern "C" {
     63 #endif
     64 
     65 /****************************************************************************************\
     66 *                                    Image Processing                                    *
     67 \****************************************************************************************/
     68 
     69 /* Copies source 2D array inside of the larger destination array and
     70    makes a border of the specified type (IPL_BORDER_*) around the copied area. */
     71 CVAPI(void) cvCopyMakeBorder( const CvArr* src, CvArr* dst, CvPoint offset,
     72                               int bordertype, CvScalar value CV_DEFAULT(cvScalarAll(0)));
     73 
     74 #define CV_BLUR_NO_SCALE 0
     75 #define CV_BLUR  1
     76 #define CV_GAUSSIAN  2
     77 #define CV_MEDIAN 3
     78 #define CV_BILATERAL 4
     79 
     80 /* Smoothes array (removes noise) */
     81 CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst,
     82                       int smoothtype CV_DEFAULT(CV_GAUSSIAN),
     83                       int size1 CV_DEFAULT(3),
     84                       int size2 CV_DEFAULT(0),
     85                       double sigma1 CV_DEFAULT(0),
     86                       double sigma2 CV_DEFAULT(0));
     87 
     88 /* Convolves the image with the kernel */
     89 CVAPI(void) cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel,
     90                         CvPoint anchor CV_DEFAULT(cvPoint(-1,-1)));
     91 
     92 /* Finds integral image: SUM(X,Y) = sum(x<X,y<Y)I(x,y) */
     93 CVAPI(void) cvIntegral( const CvArr* image, CvArr* sum,
     94                        CvArr* sqsum CV_DEFAULT(NULL),
     95                        CvArr* tilted_sum CV_DEFAULT(NULL));
     96 
     97 /*
     98    Smoothes the input image with gaussian kernel and then down-samples it.
     99    dst_width = floor(src_width/2)[+1],
    100    dst_height = floor(src_height/2)[+1]
    101 */
    102 CVAPI(void)  cvPyrDown( const CvArr* src, CvArr* dst,
    103                         int filter CV_DEFAULT(CV_GAUSSIAN_5x5) );
    104 
    105 /*
    106    Up-samples image and smoothes the result with gaussian kernel.
    107    dst_width = src_width*2,
    108    dst_height = src_height*2
    109 */
    110 CVAPI(void)  cvPyrUp( const CvArr* src, CvArr* dst,
    111                       int filter CV_DEFAULT(CV_GAUSSIAN_5x5) );
    112 
    113 /* Builds pyramid for an image */
    114 CVAPI(CvMat**) cvCreatePyramid( const CvArr* img, int extra_layers, double rate,
    115                                 const CvSize* layer_sizes CV_DEFAULT(0),
    116                                 CvArr* bufarr CV_DEFAULT(0),
    117                                 int calc CV_DEFAULT(1),
    118                                 int filter CV_DEFAULT(CV_GAUSSIAN_5x5) );
    119 
    120 /* Releases pyramid */
    121 CVAPI(void)  cvReleasePyramid( CvMat*** pyramid, int extra_layers );
    122 
    123 
    124 /* Splits color or grayscale image into multiple connected components
    125    of nearly the same color/brightness using modification of Burt algorithm.
    126    comp with contain a pointer to sequence (CvSeq)
    127    of connected components (CvConnectedComp) */
    128 CVAPI(void) cvPyrSegmentation( IplImage* src, IplImage* dst,
    129                               CvMemStorage* storage, CvSeq** comp,
    130                               int level, double threshold1,
    131                               double threshold2 );
    132 
    133 /* Filters image using meanshift algorithm */
    134 CVAPI(void) cvPyrMeanShiftFiltering( const CvArr* src, CvArr* dst,
    135     double sp, double sr, int max_level CV_DEFAULT(1),
    136     CvTermCriteria termcrit CV_DEFAULT(cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,5,1)));
    137 
    138 /* Segments image using seed "markers" */
    139 CVAPI(void) cvWatershed( const CvArr* image, CvArr* markers );
    140 
    141 #define CV_INPAINT_NS      0
    142 #define CV_INPAINT_TELEA   1
    143 
    144 /* Inpaints the selected region in the image */
    145 CVAPI(void) cvInpaint( const CvArr* src, const CvArr* inpaint_mask,
    146                        CvArr* dst, double inpaintRange, int flags );
    147 
    148 #define CV_SCHARR -1
    149 #define CV_MAX_SOBEL_KSIZE 7
    150 
    151 /* Calculates an image derivative using generalized Sobel
    152    (aperture_size = 1,3,5,7) or Scharr (aperture_size = -1) operator.
    153    Scharr can be used only for the first dx or dy derivative */
    154 CVAPI(void) cvSobel( const CvArr* src, CvArr* dst,
    155                     int xorder, int yorder,
    156                     int aperture_size CV_DEFAULT(3));
    157 
    158 /* Calculates the image Laplacian: (d2/dx + d2/dy)I */
    159 CVAPI(void) cvLaplace( const CvArr* src, CvArr* dst,
    160                       int aperture_size CV_DEFAULT(3) );
    161 
    162 /* Constants for color conversion */
    163 #define  CV_BGR2BGRA    0
    164 #define  CV_RGB2RGBA    CV_BGR2BGRA
    165 
    166 #define  CV_BGRA2BGR    1
    167 #define  CV_RGBA2RGB    CV_BGRA2BGR
    168 
    169 #define  CV_BGR2RGBA    2
    170 #define  CV_RGB2BGRA    CV_BGR2RGBA
    171 
    172 #define  CV_RGBA2BGR    3
    173 #define  CV_BGRA2RGB    CV_RGBA2BGR
    174 
    175 #define  CV_BGR2RGB     4
    176 #define  CV_RGB2BGR     CV_BGR2RGB
    177 
    178 #define  CV_BGRA2RGBA   5
    179 #define  CV_RGBA2BGRA   CV_BGRA2RGBA
    180 
    181 #define  CV_BGR2GRAY    6
    182 #define  CV_RGB2GRAY    7
    183 #define  CV_GRAY2BGR    8
    184 #define  CV_GRAY2RGB    CV_GRAY2BGR
    185 #define  CV_GRAY2BGRA   9
    186 #define  CV_GRAY2RGBA   CV_GRAY2BGRA
    187 #define  CV_BGRA2GRAY   10
    188 #define  CV_RGBA2GRAY   11
    189 
    190 #define  CV_BGR2BGR565  12
    191 #define  CV_RGB2BGR565  13
    192 #define  CV_BGR5652BGR  14
    193 #define  CV_BGR5652RGB  15
    194 #define  CV_BGRA2BGR565 16
    195 #define  CV_RGBA2BGR565 17
    196 #define  CV_BGR5652BGRA 18
    197 #define  CV_BGR5652RGBA 19
    198 
    199 #define  CV_GRAY2BGR565 20
    200 #define  CV_BGR5652GRAY 21
    201 
    202 #define  CV_BGR2BGR555  22
    203 #define  CV_RGB2BGR555  23
    204 #define  CV_BGR5552BGR  24
    205 #define  CV_BGR5552RGB  25
    206 #define  CV_BGRA2BGR555 26
    207 #define  CV_RGBA2BGR555 27
    208 #define  CV_BGR5552BGRA 28
    209 #define  CV_BGR5552RGBA 29
    210 
    211 #define  CV_GRAY2BGR555 30
    212 #define  CV_BGR5552GRAY 31
    213 
    214 #define  CV_BGR2XYZ     32
    215 #define  CV_RGB2XYZ     33
    216 #define  CV_XYZ2BGR     34
    217 #define  CV_XYZ2RGB     35
    218 
    219 #define  CV_BGR2YCrCb   36
    220 #define  CV_RGB2YCrCb   37
    221 #define  CV_YCrCb2BGR   38
    222 #define  CV_YCrCb2RGB   39
    223 
    224 #define  CV_BGR2HSV     40
    225 #define  CV_RGB2HSV     41
    226 
    227 #define  CV_BGR2Lab     44
    228 #define  CV_RGB2Lab     45
    229 
    230 #define  CV_BayerBG2BGR 46
    231 #define  CV_BayerGB2BGR 47
    232 #define  CV_BayerRG2BGR 48
    233 #define  CV_BayerGR2BGR 49
    234 
    235 #define  CV_BayerBG2RGB CV_BayerRG2BGR
    236 #define  CV_BayerGB2RGB CV_BayerGR2BGR
    237 #define  CV_BayerRG2RGB CV_BayerBG2BGR
    238 #define  CV_BayerGR2RGB CV_BayerGB2BGR
    239 
    240 #define  CV_BGR2Luv     50
    241 #define  CV_RGB2Luv     51
    242 #define  CV_BGR2HLS     52
    243 #define  CV_RGB2HLS     53
    244 
    245 #define  CV_HSV2BGR     54
    246 #define  CV_HSV2RGB     55
    247 
    248 #define  CV_Lab2BGR     56
    249 #define  CV_Lab2RGB     57
    250 #define  CV_Luv2BGR     58
    251 #define  CV_Luv2RGB     59
    252 #define  CV_HLS2BGR     60
    253 #define  CV_HLS2RGB     61
    254 
    255 #define  CV_COLORCVT_MAX  100
    256 
    257 /* Converts input array pixels from one color space to another */
    258 CVAPI(void)  cvCvtColor( const CvArr* src, CvArr* dst, int code );
    259 
    260 #define  CV_INTER_NN        0
    261 #define  CV_INTER_LINEAR    1
    262 #define  CV_INTER_CUBIC     2
    263 #define  CV_INTER_AREA      3
    264 
    265 #define  CV_WARP_FILL_OUTLIERS 8
    266 #define  CV_WARP_INVERSE_MAP  16
    267 
    268 /* Resizes image (input array is resized to fit the destination array) */
    269 CVAPI(void)  cvResize( const CvArr* src, CvArr* dst,
    270                        int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
    271 
    272 /* Warps image with affine transform */
    273 CVAPI(void)  cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
    274                            int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS),
    275                            CvScalar fillval CV_DEFAULT(cvScalarAll(0)) );
    276 
    277 /* Computes affine transform matrix for mapping src[i] to dst[i] (i=0,1,2) */
    278 CVAPI(CvMat*) cvGetAffineTransform( const CvPoint2D32f * src,
    279                                     const CvPoint2D32f * dst,
    280                                     CvMat * map_matrix );
    281 
    282 /* Computes rotation_matrix matrix */
    283 CVAPI(CvMat*)  cv2DRotationMatrix( CvPoint2D32f center, double angle,
    284                                    double scale, CvMat* map_matrix );
    285 
    286 /* Warps image with perspective (projective) transform */
    287 CVAPI(void)  cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
    288                                 int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS),
    289                                 CvScalar fillval CV_DEFAULT(cvScalarAll(0)) );
    290 
    291 /* Computes perspective transform matrix for mapping src[i] to dst[i] (i=0,1,2,3) */
    292 CVAPI(CvMat*) cvGetPerspectiveTransform( const CvPoint2D32f* src,
    293                                          const CvPoint2D32f* dst,
    294                                          CvMat* map_matrix );
    295 
    296 /* Performs generic geometric transformation using the specified coordinate maps */
    297 CVAPI(void)  cvRemap( const CvArr* src, CvArr* dst,
    298                       const CvArr* mapx, const CvArr* mapy,
    299                       int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS),
    300                       CvScalar fillval CV_DEFAULT(cvScalarAll(0)) );
    301 
    302 /* Converts mapx & mapy from floating-point to integer formats for cvRemap */
    303 CVAPI(void)  cvConvertMaps( const CvArr* mapx, const CvArr* mapy,
    304                             CvArr* mapxy, CvArr* mapalpha );
    305 
    306 /* Performs forward or inverse log-polar image transform */
    307 CVAPI(void)  cvLogPolar( const CvArr* src, CvArr* dst,
    308                          CvPoint2D32f center, double M,
    309                          int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS));
    310 
    311 #define  CV_SHAPE_RECT      0
    312 #define  CV_SHAPE_CROSS     1
    313 #define  CV_SHAPE_ELLIPSE   2
    314 #define  CV_SHAPE_CUSTOM    100
    315 
    316 /* creates structuring element used for morphological operations */
    317 CVAPI(IplConvKernel*)  cvCreateStructuringElementEx(
    318             int cols, int  rows, int  anchor_x, int  anchor_y,
    319             int shape, int* values CV_DEFAULT(NULL) );
    320 
    321 /* releases structuring element */
    322 CVAPI(void)  cvReleaseStructuringElement( IplConvKernel** element );
    323 
    324 /* erodes input image (applies minimum filter) one or more times.
    325    If element pointer is NULL, 3x3 rectangular element is used */
    326 CVAPI(void)  cvErode( const CvArr* src, CvArr* dst,
    327                       IplConvKernel* element CV_DEFAULT(NULL),
    328                       int iterations CV_DEFAULT(1) );
    329 
    330 /* dilates input image (applies maximum filter) one or more times.
    331    If element pointer is NULL, 3x3 rectangular element is used */
    332 CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst,
    333                        IplConvKernel* element CV_DEFAULT(NULL),
    334                        int iterations CV_DEFAULT(1) );
    335 
    336 #define CV_MOP_OPEN         2
    337 #define CV_MOP_CLOSE        3
    338 #define CV_MOP_GRADIENT     4
    339 #define CV_MOP_TOPHAT       5
    340 #define CV_MOP_BLACKHAT     6
    341 
    342 /* Performs complex morphological transformation */
    343 CVAPI(void)  cvMorphologyEx( const CvArr* src, CvArr* dst,
    344                              CvArr* temp, IplConvKernel* element,
    345                              int operation, int iterations CV_DEFAULT(1) );
    346 
    347 /* Calculates all spatial and central moments up to the 3rd order */
    348 CVAPI(void) cvMoments( const CvArr* arr, CvMoments* moments, int binary CV_DEFAULT(0));
    349 
    350 /* Retrieve particular spatial, central or normalized central moments */
    351 CVAPI(double)  cvGetSpatialMoment( CvMoments* moments, int x_order, int y_order );
    352 CVAPI(double)  cvGetCentralMoment( CvMoments* moments, int x_order, int y_order );
    353 CVAPI(double)  cvGetNormalizedCentralMoment( CvMoments* moments,
    354                                              int x_order, int y_order );
    355 
    356 /* Calculates 7 Hu's invariants from precalculated spatial and central moments */
    357 CVAPI(void) cvGetHuMoments( CvMoments*  moments, CvHuMoments*  hu_moments );
    358 
    359 /*********************************** data sampling **************************************/
    360 
    361 /* Fetches pixels that belong to the specified line segment and stores them to the buffer.
    362    Returns the number of retrieved points. */
    363 CVAPI(int)  cvSampleLine( const CvArr* image, CvPoint pt1, CvPoint pt2, void* buffer,
    364                           int connectivity CV_DEFAULT(8));
    365 
    366 /* Retrieves the rectangular image region with specified center from the input array.
    367  dst(x,y) <- src(x + center.x - dst_width/2, y + center.y - dst_height/2).
    368  Values of pixels with fractional coordinates are retrieved using bilinear interpolation*/
    369 CVAPI(void)  cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center );
    370 
    371 
    372 /* Retrieves quadrangle from the input array.
    373     matrixarr = ( a11  a12 | b1 )   dst(x,y) <- src(A[x y]' + b)
    374                 ( a21  a22 | b2 )   (bilinear interpolation is used to retrieve pixels
    375                                      with fractional coordinates)
    376 */
    377 CVAPI(void)  cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst,
    378                                     const CvMat* map_matrix );
    379 
    380 /* Methods for comparing two array */
    381 #define  CV_TM_SQDIFF        0
    382 #define  CV_TM_SQDIFF_NORMED 1
    383 #define  CV_TM_CCORR         2
    384 #define  CV_TM_CCORR_NORMED  3
    385 #define  CV_TM_CCOEFF        4
    386 #define  CV_TM_CCOEFF_NORMED 5
    387 
    388 /* Measures similarity between template and overlapped windows in the source image
    389    and fills the resultant image with the measurements */
    390 CVAPI(void)  cvMatchTemplate( const CvArr* image, const CvArr* templ,
    391                               CvArr* result, int method );
    392 
    393 /* Computes earth mover distance between
    394    two weighted point sets (called signatures) */
    395 CVAPI(float)  cvCalcEMD2( const CvArr* signature1,
    396                           const CvArr* signature2,
    397                           int distance_type,
    398                           CvDistanceFunction distance_func CV_DEFAULT(NULL),
    399                           const CvArr* cost_matrix CV_DEFAULT(NULL),
    400                           CvArr* flow CV_DEFAULT(NULL),
    401                           float* lower_bound CV_DEFAULT(NULL),
    402                           void* userdata CV_DEFAULT(NULL));
    403 
    404 /****************************************************************************************\
    405 *                              Contours retrieving                                       *
    406 \****************************************************************************************/
    407 
    408 /* Retrieves outer and optionally inner boundaries of white (non-zero) connected
    409    components in the black (zero) background */
    410 CVAPI(int)  cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
    411                             int header_size CV_DEFAULT(sizeof(CvContour)),
    412                             int mode CV_DEFAULT(CV_RETR_LIST),
    413                             int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
    414                             CvPoint offset CV_DEFAULT(cvPoint(0,0)));
    415 
    416 
    417 /* Initalizes contour retrieving process.
    418    Calls cvStartFindContours.
    419    Calls cvFindNextContour until null pointer is returned
    420    or some other condition becomes true.
    421    Calls cvEndFindContours at the end. */
    422 CVAPI(CvContourScanner)  cvStartFindContours( CvArr* image, CvMemStorage* storage,
    423                             int header_size CV_DEFAULT(sizeof(CvContour)),
    424                             int mode CV_DEFAULT(CV_RETR_LIST),
    425                             int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
    426                             CvPoint offset CV_DEFAULT(cvPoint(0,0)));
    427 
    428 /* Retrieves next contour */
    429 CVAPI(CvSeq*)  cvFindNextContour( CvContourScanner scanner );
    430 
    431 
    432 /* Substitutes the last retrieved contour with the new one
    433    (if the substitutor is null, the last retrieved contour is removed from the tree) */
    434 CVAPI(void)   cvSubstituteContour( CvContourScanner scanner, CvSeq* new_contour );
    435 
    436 
    437 /* Releases contour scanner and returns pointer to the first outer contour */
    438 CVAPI(CvSeq*)  cvEndFindContours( CvContourScanner* scanner );
    439 
    440 /* Approximates a single Freeman chain or a tree of chains to polygonal curves */
    441 CVAPI(CvSeq*) cvApproxChains( CvSeq* src_seq, CvMemStorage* storage,
    442                             int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
    443                             double parameter CV_DEFAULT(0),
    444                             int  minimal_perimeter CV_DEFAULT(0),
    445                             int  recursive CV_DEFAULT(0));
    446 
    447 
    448 /* Initalizes Freeman chain reader.
    449    The reader is used to iteratively get coordinates of all the chain points.
    450    If the Freeman codes should be read as is, a simple sequence reader should be used */
    451 CVAPI(void) cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );
    452 
    453 /* Retrieves the next chain point */
    454 CVAPI(CvPoint) cvReadChainPoint( CvChainPtReader* reader );
    455 
    456 
    457 /****************************************************************************************\
    458 *                                  Motion Analysis                                       *
    459 \****************************************************************************************/
    460 
    461 /************************************ optical flow ***************************************/
    462 
    463 /* Calculates optical flow for 2 images using classical Lucas & Kanade algorithm */
    464 CVAPI(void)  cvCalcOpticalFlowLK( const CvArr* prev, const CvArr* curr,
    465                                   CvSize win_size, CvArr* velx, CvArr* vely );
    466 
    467 /* Calculates optical flow for 2 images using block matching algorithm */
    468 CVAPI(void)  cvCalcOpticalFlowBM( const CvArr* prev, const CvArr* curr,
    469                                   CvSize block_size, CvSize shift_size,
    470                                   CvSize max_range, int use_previous,
    471                                   CvArr* velx, CvArr* vely );
    472 
    473 /* Calculates Optical flow for 2 images using Horn & Schunck algorithm */
    474 CVAPI(void)  cvCalcOpticalFlowHS( const CvArr* prev, const CvArr* curr,
    475                                   int use_previous, CvArr* velx, CvArr* vely,
    476                                   double lambda, CvTermCriteria criteria );
    477 
    478 #define  CV_LKFLOW_PYR_A_READY       1
    479 #define  CV_LKFLOW_PYR_B_READY       2
    480 #define  CV_LKFLOW_INITIAL_GUESSES   4
    481 #define  CV_LKFLOW_GET_MIN_EIGENVALS 8
    482 
    483 /* It is Lucas & Kanade method, modified to use pyramids.
    484    Also it does several iterations to get optical flow for
    485    every point at every pyramid level.
    486    Calculates optical flow between two images for certain set of points (i.e.
    487    it is a "sparse" optical flow, which is opposite to the previous 3 methods) */
    488 CVAPI(void)  cvCalcOpticalFlowPyrLK( const CvArr*  prev, const CvArr*  curr,
    489                                      CvArr*  prev_pyr, CvArr*  curr_pyr,
    490                                      const CvPoint2D32f* prev_features,
    491                                      CvPoint2D32f* curr_features,
    492                                      int       count,
    493                                      CvSize    win_size,
    494                                      int       level,
    495                                      char*     status,
    496                                      float*    track_error,
    497                                      CvTermCriteria criteria,
    498                                      int       flags );
    499 
    500 
    501 /* Modification of a previous sparse optical flow algorithm to calculate
    502    affine flow */
    503 CVAPI(void)  cvCalcAffineFlowPyrLK( const CvArr*  prev, const CvArr*  curr,
    504                                     CvArr*  prev_pyr, CvArr*  curr_pyr,
    505                                     const CvPoint2D32f* prev_features,
    506                                     CvPoint2D32f* curr_features,
    507                                     float* matrices, int  count,
    508                                     CvSize win_size, int  level,
    509                                     char* status, float* track_error,
    510                                     CvTermCriteria criteria, int flags );
    511 
    512 /* Estimate rigid transformation between 2 images or 2 point sets */
    513 CVAPI(int)  cvEstimateRigidTransform( const CvArr* A, const CvArr* B,
    514                                       CvMat* M, int full_affine );
    515 
    516 /********************************* motion templates *************************************/
    517 
    518 /****************************************************************************************\
    519 *        All the motion template functions work only with single channel images.         *
    520 *        Silhouette image must have depth IPL_DEPTH_8U or IPL_DEPTH_8S                   *
    521 *        Motion history image must have depth IPL_DEPTH_32F,                             *
    522 *        Gradient mask - IPL_DEPTH_8U or IPL_DEPTH_8S,                                   *
    523 *        Motion orientation image - IPL_DEPTH_32F                                        *
    524 *        Segmentation mask - IPL_DEPTH_32F                                               *
    525 *        All the angles are in degrees, all the times are in milliseconds                *
    526 \****************************************************************************************/
    527 
    528 /* Updates motion history image given motion silhouette */
    529 CVAPI(void)    cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi,
    530                                       double timestamp, double duration );
    531 
    532 /* Calculates gradient of the motion history image and fills
    533    a mask indicating where the gradient is valid */
    534 CVAPI(void)    cvCalcMotionGradient( const CvArr* mhi, CvArr* mask, CvArr* orientation,
    535                                      double delta1, double delta2,
    536                                      int aperture_size CV_DEFAULT(3));
    537 
    538 /* Calculates average motion direction within a selected motion region
    539    (region can be selected by setting ROIs and/or by composing a valid gradient mask
    540    with the region mask) */
    541 CVAPI(double)  cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* mask,
    542                                         const CvArr* mhi, double timestamp,
    543                                         double duration );
    544 
    545 /* Splits a motion history image into a few parts corresponding to separate independent motions
    546    (e.g. left hand, right hand) */
    547 CVAPI(CvSeq*)  cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask,
    548                                 CvMemStorage* storage,
    549                                 double timestamp, double seg_thresh );
    550 
    551 /*********************** Background statistics accumulation *****************************/
    552 
    553 /* Adds image to accumulator */
    554 CVAPI(void)  cvAcc( const CvArr* image, CvArr* sum,
    555                     const CvArr* mask CV_DEFAULT(NULL) );
    556 
    557 /* Adds squared image to accumulator */
    558 CVAPI(void)  cvSquareAcc( const CvArr* image, CvArr* sqsum,
    559                           const CvArr* mask CV_DEFAULT(NULL) );
    560 
    561 /* Adds a product of two images to accumulator */
    562 CVAPI(void)  cvMultiplyAcc( const CvArr* image1, const CvArr* image2, CvArr* acc,
    563                             const CvArr* mask CV_DEFAULT(NULL) );
    564 
    565 /* Adds image to accumulator with weights: acc = acc*(1-alpha) + image*alpha */
    566 CVAPI(void)  cvRunningAvg( const CvArr* image, CvArr* acc, double alpha,
    567                            const CvArr* mask CV_DEFAULT(NULL) );
    568 
    569 
    570 /****************************************************************************************\
    571 *                                       Tracking                                         *
    572 \****************************************************************************************/
    573 
    574 /* Implements CAMSHIFT algorithm - determines object position, size and orientation
    575    from the object histogram back project (extension of meanshift) */
    576 CVAPI(int)  cvCamShift( const CvArr* prob_image, CvRect  window,
    577                        CvTermCriteria criteria, CvConnectedComp* comp,
    578                        CvBox2D* box CV_DEFAULT(NULL) );
    579 
    580 /* Implements MeanShift algorithm - determines object position
    581    from the object histogram back project */
    582 CVAPI(int)  cvMeanShift( const CvArr* prob_image, CvRect  window,
    583                         CvTermCriteria criteria, CvConnectedComp* comp );
    584 
    585 /* Creates ConDensation filter state */
    586 CVAPI(CvConDensation*)  cvCreateConDensation( int dynam_params,
    587                                              int measure_params,
    588                                              int sample_count );
    589 
    590 /* Releases ConDensation filter state */
    591 CVAPI(void)  cvReleaseConDensation( CvConDensation** condens );
    592 
    593 /* Updates ConDensation filter by time (predict future state of the system) */
    594 CVAPI(void)  cvConDensUpdateByTime( CvConDensation* condens);
    595 
    596 /* Initializes ConDensation filter samples  */
    597 CVAPI(void)  cvConDensInitSampleSet( CvConDensation* condens, CvMat* lower_bound, CvMat* upper_bound );
    598 
    599 /* Creates Kalman filter and sets A, B, Q, R and state to some initial values */
    600 CVAPI(CvKalman*) cvCreateKalman( int dynam_params, int measure_params,
    601                                 int control_params CV_DEFAULT(0));
    602 
    603 /* Releases Kalman filter state */
    604 CVAPI(void)  cvReleaseKalman( CvKalman** kalman);
    605 
    606 /* Updates Kalman filter by time (predicts future state of the system) */
    607 CVAPI(const CvMat*)  cvKalmanPredict( CvKalman* kalman,
    608                                      const CvMat* control CV_DEFAULT(NULL));
    609 
    610 /* Updates Kalman filter by measurement
    611    (corrects state of the system and internal matrices) */
    612 CVAPI(const CvMat*)  cvKalmanCorrect( CvKalman* kalman, const CvMat* measurement );
    613 
    614 /****************************************************************************************\
    615 *                              Planar subdivisions                                       *
    616 \****************************************************************************************/
    617 
    618 /* Initializes Delaunay triangulation */
    619 CVAPI(void)  cvInitSubdivDelaunay2D( CvSubdiv2D* subdiv, CvRect rect );
    620 
    621 /* Creates new subdivision */
    622 CVAPI(CvSubdiv2D*)  cvCreateSubdiv2D( int subdiv_type, int header_size,
    623                                       int vtx_size, int quadedge_size,
    624                                       CvMemStorage* storage );
    625 
    626 /************************* high-level subdivision functions ***************************/
    627 
    628 /* Simplified Delaunay diagram creation */
    629 CV_INLINE  CvSubdiv2D* cvCreateSubdivDelaunay2D( CvRect rect, CvMemStorage* storage )
    630 {
    631     CvSubdiv2D* subdiv = cvCreateSubdiv2D( CV_SEQ_KIND_SUBDIV2D, sizeof(*subdiv),
    632                          sizeof(CvSubdiv2DPoint), sizeof(CvQuadEdge2D), storage );
    633 
    634     cvInitSubdivDelaunay2D( subdiv, rect );
    635     return subdiv;
    636 }
    637 
    638 
    639 /* Inserts new point to the Delaunay triangulation */
    640 CVAPI(CvSubdiv2DPoint*)  cvSubdivDelaunay2DInsert( CvSubdiv2D* subdiv, CvPoint2D32f pt);
    641 
    642 /* Locates a point within the Delaunay triangulation (finds the edge
    643    the point is left to or belongs to, or the triangulation point the given
    644    point coinsides with */
    645 CVAPI(CvSubdiv2DPointLocation)  cvSubdiv2DLocate(
    646                                CvSubdiv2D* subdiv, CvPoint2D32f pt,
    647                                CvSubdiv2DEdge* edge,
    648                                CvSubdiv2DPoint** vertex CV_DEFAULT(NULL) );
    649 
    650 /* Calculates Voronoi tesselation (i.e. coordinates of Voronoi points) */
    651 CVAPI(void)  cvCalcSubdivVoronoi2D( CvSubdiv2D* subdiv );
    652 
    653 
    654 /* Removes all Voronoi points from the tesselation */
    655 CVAPI(void)  cvClearSubdivVoronoi2D( CvSubdiv2D* subdiv );
    656 
    657 
    658 /* Finds the nearest to the given point vertex in subdivision. */
    659 CVAPI(CvSubdiv2DPoint*) cvFindNearestPoint2D( CvSubdiv2D* subdiv, CvPoint2D32f pt );
    660 
    661 
    662 /************ Basic quad-edge navigation and operations ************/
    663 
    664 CV_INLINE  CvSubdiv2DEdge  cvSubdiv2DNextEdge( CvSubdiv2DEdge edge )
    665 {
    666     return  CV_SUBDIV2D_NEXT_EDGE(edge);
    667 }
    668 
    669 
    670 CV_INLINE  CvSubdiv2DEdge  cvSubdiv2DRotateEdge( CvSubdiv2DEdge edge, int rotate )
    671 {
    672     return  (edge & ~3) + ((edge + rotate) & 3);
    673 }
    674 
    675 CV_INLINE  CvSubdiv2DEdge  cvSubdiv2DSymEdge( CvSubdiv2DEdge edge )
    676 {
    677     return edge ^ 2;
    678 }
    679 
    680 CV_INLINE  CvSubdiv2DEdge  cvSubdiv2DGetEdge( CvSubdiv2DEdge edge, CvNextEdgeType type )
    681 {
    682     CvQuadEdge2D* e = (CvQuadEdge2D*)(edge & ~3);
    683     edge = e->next[(edge + (int)type) & 3];
    684     return  (edge & ~3) + ((edge + ((int)type >> 4)) & 3);
    685 }
    686 
    687 
    688 CV_INLINE  CvSubdiv2DPoint*  cvSubdiv2DEdgeOrg( CvSubdiv2DEdge edge )
    689 {
    690     CvQuadEdge2D* e = (CvQuadEdge2D*)(edge & ~3);
    691     return (CvSubdiv2DPoint*)e->pt[edge & 3];
    692 }
    693 
    694 
    695 CV_INLINE  CvSubdiv2DPoint*  cvSubdiv2DEdgeDst( CvSubdiv2DEdge edge )
    696 {
    697     CvQuadEdge2D* e = (CvQuadEdge2D*)(edge & ~3);
    698     return (CvSubdiv2DPoint*)e->pt[(edge + 2) & 3];
    699 }
    700 
    701 
    702 CV_INLINE  double  cvTriangleArea( CvPoint2D32f a, CvPoint2D32f b, CvPoint2D32f c )
    703 {
    704     return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
    705 }
    706 
    707 
    708 /****************************************************************************************\
    709 *                            Contour Processing and Shape Analysis                       *
    710 \****************************************************************************************/
    711 
    712 #define CV_POLY_APPROX_DP 0
    713 
    714 /* Approximates a single polygonal curve (contour) or
    715    a tree of polygonal curves (contours) */
    716 CVAPI(CvSeq*)  cvApproxPoly( const void* src_seq,
    717                              int header_size, CvMemStorage* storage,
    718                              int method, double parameter,
    719                              int parameter2 CV_DEFAULT(0));
    720 
    721 #define CV_DOMINANT_IPAN 1
    722 
    723 /* Finds high-curvature points of the contour */
    724 CVAPI(CvSeq*) cvFindDominantPoints( CvSeq* contour, CvMemStorage* storage,
    725                                    int method CV_DEFAULT(CV_DOMINANT_IPAN),
    726                                    double parameter1 CV_DEFAULT(0),
    727                                    double parameter2 CV_DEFAULT(0),
    728                                    double parameter3 CV_DEFAULT(0),
    729                                    double parameter4 CV_DEFAULT(0));
    730 
    731 /* Calculates perimeter of a contour or length of a part of contour */
    732 CVAPI(double)  cvArcLength( const void* curve,
    733                             CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ),
    734                             int is_closed CV_DEFAULT(-1));
    735 #define cvContourPerimeter( contour ) cvArcLength( contour, CV_WHOLE_SEQ, 1 )
    736 
    737 /* Calculates contour boundning rectangle (update=1) or
    738    just retrieves pre-calculated rectangle (update=0) */
    739 CVAPI(CvRect)  cvBoundingRect( CvArr* points, int update CV_DEFAULT(0) );
    740 
    741 /* Calculates area of a contour or contour segment */
    742 CVAPI(double)  cvContourArea( const CvArr* contour,
    743                               CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ));
    744 
    745 /* Finds minimum area rotated rectangle bounding a set of points */
    746 CVAPI(CvBox2D)  cvMinAreaRect2( const CvArr* points,
    747                                 CvMemStorage* storage CV_DEFAULT(NULL));
    748 
    749 /* Finds minimum enclosing circle for a set of points */
    750 CVAPI(int)  cvMinEnclosingCircle( const CvArr* points,
    751                                   CvPoint2D32f* center, float* radius );
    752 
    753 #define CV_CONTOURS_MATCH_I1  1
    754 #define CV_CONTOURS_MATCH_I2  2
    755 #define CV_CONTOURS_MATCH_I3  3
    756 
    757 /* Compares two contours by matching their moments */
    758 CVAPI(double)  cvMatchShapes( const void* object1, const void* object2,
    759                               int method, double parameter CV_DEFAULT(0));
    760 
    761 /* Builds hierarhical representation of a contour */
    762 CVAPI(CvContourTree*)  cvCreateContourTree( const CvSeq* contour,
    763                                             CvMemStorage* storage,
    764                                             double threshold );
    765 
    766 /* Reconstruct (completelly or partially) contour a from contour tree */
    767 CVAPI(CvSeq*)  cvContourFromContourTree( const CvContourTree* tree,
    768                                          CvMemStorage* storage,
    769                                          CvTermCriteria criteria );
    770 
    771 /* Compares two contour trees */
    772 #define  CV_CONTOUR_TREES_MATCH_I1  1
    773 
    774 CVAPI(double)  cvMatchContourTrees( const CvContourTree* tree1,
    775                                     const CvContourTree* tree2,
    776                                     int method, double threshold );
    777 
    778 /* Calculates histogram of a contour */
    779 CVAPI(void)  cvCalcPGH( const CvSeq* contour, CvHistogram* hist );
    780 
    781 #define CV_CLOCKWISE         1
    782 #define CV_COUNTER_CLOCKWISE 2
    783 
    784 /* Calculates exact convex hull of 2d point set */
    785 CVAPI(CvSeq*) cvConvexHull2( const CvArr* input,
    786                              void* hull_storage CV_DEFAULT(NULL),
    787                              int orientation CV_DEFAULT(CV_CLOCKWISE),
    788                              int return_points CV_DEFAULT(0));
    789 
    790 /* Checks whether the contour is convex or not (returns 1 if convex, 0 if not) */
    791 CVAPI(int)  cvCheckContourConvexity( const CvArr* contour );
    792 
    793 /* Finds convexity defects for the contour */
    794 CVAPI(CvSeq*)  cvConvexityDefects( const CvArr* contour, const CvArr* convexhull,
    795                                    CvMemStorage* storage CV_DEFAULT(NULL));
    796 
    797 /* Fits ellipse into a set of 2d points */
    798 CVAPI(CvBox2D) cvFitEllipse2( const CvArr* points );
    799 
    800 /* Finds minimum rectangle containing two given rectangles */
    801 CVAPI(CvRect)  cvMaxRect( const CvRect* rect1, const CvRect* rect2 );
    802 
    803 /* Finds coordinates of the box vertices */
    804 CVAPI(void) cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] );
    805 
    806 /* Initializes sequence header for a matrix (column or row vector) of points -
    807    a wrapper for cvMakeSeqHeaderForArray (it does not initialize bounding rectangle!!!) */
    808 CVAPI(CvSeq*) cvPointSeqFromMat( int seq_kind, const CvArr* mat,
    809                                  CvContour* contour_header,
    810                                  CvSeqBlock* block );
    811 
    812 /* Checks whether the point is inside polygon, outside, on an edge (at a vertex).
    813    Returns positive, negative or zero value, correspondingly.
    814    Optionally, measures a signed distance between
    815    the point and the nearest polygon edge (measure_dist=1) */
    816 CVAPI(double) cvPointPolygonTest( const CvArr* contour,
    817                                   CvPoint2D32f pt, int measure_dist );
    818 
    819 /****************************************************************************************\
    820 *                                  Histogram functions                                   *
    821 \****************************************************************************************/
    822 
    823 /* Creates new histogram */
    824 CVAPI(CvHistogram*)  cvCreateHist( int dims, int* sizes, int type,
    825                                    float** ranges CV_DEFAULT(NULL),
    826                                    int uniform CV_DEFAULT(1));
    827 
    828 /* Assignes histogram bin ranges */
    829 CVAPI(void)  cvSetHistBinRanges( CvHistogram* hist, float** ranges,
    830                                 int uniform CV_DEFAULT(1));
    831 
    832 /* Creates histogram header for array */
    833 CVAPI(CvHistogram*)  cvMakeHistHeaderForArray(
    834                             int  dims, int* sizes, CvHistogram* hist,
    835                             float* data, float** ranges CV_DEFAULT(NULL),
    836                             int uniform CV_DEFAULT(1));
    837 
    838 /* Releases histogram */
    839 CVAPI(void)  cvReleaseHist( CvHistogram** hist );
    840 
    841 /* Clears all the histogram bins */
    842 CVAPI(void)  cvClearHist( CvHistogram* hist );
    843 
    844 /* Finds indices and values of minimum and maximum histogram bins */
    845 CVAPI(void)  cvGetMinMaxHistValue( const CvHistogram* hist,
    846                                    float* min_value, float* max_value,
    847                                    int* min_idx CV_DEFAULT(NULL),
    848                                    int* max_idx CV_DEFAULT(NULL));
    849 
    850 
    851 /* Normalizes histogram by dividing all bins by sum of the bins, multiplied by <factor>.
    852    After that sum of histogram bins is equal to <factor> */
    853 CVAPI(void)  cvNormalizeHist( CvHistogram* hist, double factor );
    854 
    855 
    856 /* Clear all histogram bins that are below the threshold */
    857 CVAPI(void)  cvThreshHist( CvHistogram* hist, double threshold );
    858 
    859 #define CV_COMP_CORREL        0
    860 #define CV_COMP_CHISQR        1
    861 #define CV_COMP_INTERSECT     2
    862 #define CV_COMP_BHATTACHARYYA 3
    863 
    864 /* Compares two histogram */
    865 CVAPI(double)  cvCompareHist( const CvHistogram* hist1,
    866                               const CvHistogram* hist2,
    867                               int method);
    868 
    869 /* Copies one histogram to another. Destination histogram is created if
    870    the destination pointer is NULL */
    871 CVAPI(void)  cvCopyHist( const CvHistogram* src, CvHistogram** dst );
    872 
    873 
    874 /* Calculates bayesian probabilistic histograms
    875    (each or src and dst is an array of <number> histograms */
    876 CVAPI(void)  cvCalcBayesianProb( CvHistogram** src, int number,
    877                                 CvHistogram** dst);
    878 
    879 /* Calculates array histogram */
    880 CVAPI(void)  cvCalcArrHist( CvArr** arr, CvHistogram* hist,
    881                             int accumulate CV_DEFAULT(0),
    882                             const CvArr* mask CV_DEFAULT(NULL) );
    883 
    884 CV_INLINE  void  cvCalcHist( IplImage** image, CvHistogram* hist,
    885                              int accumulate CV_DEFAULT(0),
    886                              const CvArr* mask CV_DEFAULT(NULL) )
    887 {
    888     cvCalcArrHist( (CvArr**)image, hist, accumulate, mask );
    889 }
    890 
    891 /* Calculates back project */
    892 CVAPI(void)  cvCalcArrBackProject( CvArr** image, CvArr* dst,
    893                                    const CvHistogram* hist );
    894 #define  cvCalcBackProject(image, dst, hist) cvCalcArrBackProject((CvArr**)image, dst, hist)
    895 
    896 
    897 /* Does some sort of template matching but compares histograms of
    898    template and each window location */
    899 CVAPI(void)  cvCalcArrBackProjectPatch( CvArr** image, CvArr* dst, CvSize range,
    900                                         CvHistogram* hist, int method,
    901                                         double factor );
    902 #define  cvCalcBackProjectPatch( image, dst, range, hist, method, factor ) \
    903      cvCalcArrBackProjectPatch( (CvArr**)image, dst, range, hist, method, factor )
    904 
    905 
    906 /* calculates probabilistic density (divides one histogram by another) */
    907 CVAPI(void)  cvCalcProbDensity( const CvHistogram* hist1, const CvHistogram* hist2,
    908                                 CvHistogram* dst_hist, double scale CV_DEFAULT(255) );
    909 
    910 /* equalizes histogram of 8-bit single-channel image */
    911 CVAPI(void)  cvEqualizeHist( const CvArr* src, CvArr* dst );
    912 
    913 
    914 #define  CV_VALUE  1
    915 #define  CV_ARRAY  2
    916 /* Updates active contour in order to minimize its cummulative
    917    (internal and external) energy. */
    918 CVAPI(void)  cvSnakeImage( const IplImage* image, CvPoint* points,
    919                            int  length, float* alpha,
    920                            float* beta, float* gamma,
    921                            int coeff_usage, CvSize  win,
    922                            CvTermCriteria criteria, int calc_gradient CV_DEFAULT(1));
    923 
    924 /* Calculates the cooficients of the homography matrix */
    925 CVAPI(void)  cvCalcImageHomography( float* line, CvPoint3D32f* center,
    926                                     float* intrinsic, float* homography );
    927 
    928 #define CV_DIST_MASK_3   3
    929 #define CV_DIST_MASK_5   5
    930 #define CV_DIST_MASK_PRECISE 0
    931 
    932 /* Applies distance transform to binary image */
    933 CVAPI(void)  cvDistTransform( const CvArr* src, CvArr* dst,
    934                               int distance_type CV_DEFAULT(CV_DIST_L2),
    935                               int mask_size CV_DEFAULT(3),
    936                               const float* mask CV_DEFAULT(NULL),
    937                               CvArr* labels CV_DEFAULT(NULL));
    938 
    939 
    940 /* Types of thresholding */
    941 #define CV_THRESH_BINARY      0  /* value = value > threshold ? max_value : 0       */
    942 #define CV_THRESH_BINARY_INV  1  /* value = value > threshold ? 0 : max_value       */
    943 #define CV_THRESH_TRUNC       2  /* value = value > threshold ? threshold : value   */
    944 #define CV_THRESH_TOZERO      3  /* value = value > threshold ? value : 0           */
    945 #define CV_THRESH_TOZERO_INV  4  /* value = value > threshold ? 0 : value           */
    946 #define CV_THRESH_MASK        7
    947 
    948 #define CV_THRESH_OTSU        8  /* use Otsu algorithm to choose the optimal threshold value;
    949                                     combine the flag with one of the above CV_THRESH_* values */
    950 
    951 /* Applies fixed-level threshold to grayscale image.
    952    This is a basic operation applied before retrieving contours */
    953 CVAPI(double)  cvThreshold( const CvArr*  src, CvArr*  dst,
    954                             double  threshold, double  max_value,
    955                             int threshold_type );
    956 
    957 #define CV_ADAPTIVE_THRESH_MEAN_C  0
    958 #define CV_ADAPTIVE_THRESH_GAUSSIAN_C  1
    959 
    960 /* Applies adaptive threshold to grayscale image.
    961    The two parameters for methods CV_ADAPTIVE_THRESH_MEAN_C and
    962    CV_ADAPTIVE_THRESH_GAUSSIAN_C are:
    963    neighborhood size (3, 5, 7 etc.),
    964    and a constant subtracted from mean (...,-3,-2,-1,0,1,2,3,...) */
    965 CVAPI(void)  cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
    966                                   int adaptive_method CV_DEFAULT(CV_ADAPTIVE_THRESH_MEAN_C),
    967                                   int threshold_type CV_DEFAULT(CV_THRESH_BINARY),
    968                                   int block_size CV_DEFAULT(3),
    969                                   double param1 CV_DEFAULT(5));
    970 
    971 #define CV_FLOODFILL_FIXED_RANGE (1 << 16)
    972 #define CV_FLOODFILL_MASK_ONLY   (1 << 17)
    973 
    974 /* Fills the connected component until the color difference gets large enough */
    975 CVAPI(void)  cvFloodFill( CvArr* image, CvPoint seed_point,
    976                           CvScalar new_val, CvScalar lo_diff CV_DEFAULT(cvScalarAll(0)),
    977                           CvScalar up_diff CV_DEFAULT(cvScalarAll(0)),
    978                           CvConnectedComp* comp CV_DEFAULT(NULL),
    979                           int flags CV_DEFAULT(4),
    980                           CvArr* mask CV_DEFAULT(NULL));
    981 
    982 /****************************************************************************************\
    983 *                                  Feature detection                                     *
    984 \****************************************************************************************/
    985 
    986 #define CV_CANNY_L2_GRADIENT  (1 << 31)
    987 
    988 /* Runs canny edge detector */
    989 CVAPI(void)  cvCanny( const CvArr* image, CvArr* edges, double threshold1,
    990                       double threshold2, int  aperture_size CV_DEFAULT(3) );
    991 
    992 /* Calculates constraint image for corner detection
    993    Dx^2 * Dyy + Dxx * Dy^2 - 2 * Dx * Dy * Dxy.
    994    Applying threshold to the result gives coordinates of corners */
    995 CVAPI(void) cvPreCornerDetect( const CvArr* image, CvArr* corners,
    996                               int aperture_size CV_DEFAULT(3) );
    997 
    998 /* Calculates eigen values and vectors of 2x2
    999    gradient covariation matrix at every image pixel */
   1000 CVAPI(void)  cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv,
   1001                                       int block_size, int aperture_size CV_DEFAULT(3) );
   1002 
   1003 /* Calculates minimal eigenvalue for 2x2 gradient covariation matrix at
   1004    every image pixel */
   1005 CVAPI(void)  cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval,
   1006                                  int block_size, int aperture_size CV_DEFAULT(3) );
   1007 
   1008 /* Harris corner detector:
   1009    Calculates det(M) - k*(trace(M)^2), where M is 2x2 gradient covariation matrix for each pixel */
   1010 CVAPI(void)  cvCornerHarris( const CvArr* image, CvArr* harris_responce,
   1011                              int block_size, int aperture_size CV_DEFAULT(3),
   1012                              double k CV_DEFAULT(0.04) );
   1013 
   1014 /* Adjust corner position using some sort of gradient search */
   1015 CVAPI(void)  cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,
   1016                                  int count, CvSize win, CvSize zero_zone,
   1017                                  CvTermCriteria  criteria );
   1018 
   1019 /* Finds a sparse set of points within the selected region
   1020    that seem to be easy to track */
   1021 CVAPI(void)  cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image,
   1022                                    CvArr* temp_image, CvPoint2D32f* corners,
   1023                                    int* corner_count, double  quality_level,
   1024                                    double  min_distance,
   1025                                    const CvArr* mask CV_DEFAULT(NULL),
   1026                                    int block_size CV_DEFAULT(3),
   1027                                    int use_harris CV_DEFAULT(0),
   1028                                    double k CV_DEFAULT(0.04) );
   1029 
   1030 #define CV_HOUGH_STANDARD 0
   1031 #define CV_HOUGH_PROBABILISTIC 1
   1032 #define CV_HOUGH_MULTI_SCALE 2
   1033 #define CV_HOUGH_GRADIENT 3
   1034 
   1035 /* Finds lines on binary image using one of several methods.
   1036    line_storage is either memory storage or 1 x <max number of lines> CvMat, its
   1037    number of columns is changed by the function.
   1038    method is one of CV_HOUGH_*;
   1039    rho, theta and threshold are used for each of those methods;
   1040    param1 ~ line length, param2 ~ line gap - for probabilistic,
   1041    param1 ~ srn, param2 ~ stn - for multi-scale */
   1042 CVAPI(CvSeq*)  cvHoughLines2( CvArr* image, void* line_storage, int method,
   1043                               double rho, double theta, int threshold,
   1044                               double param1 CV_DEFAULT(0), double param2 CV_DEFAULT(0));
   1045 
   1046 /* Finds circles in the image */
   1047 CVAPI(CvSeq*) cvHoughCircles( CvArr* image, void* circle_storage,
   1048                               int method, double dp, double min_dist,
   1049                               double param1 CV_DEFAULT(100),
   1050                               double param2 CV_DEFAULT(100),
   1051                               int min_radius CV_DEFAULT(0),
   1052                               int max_radius CV_DEFAULT(0));
   1053 
   1054 /* Fits a line into set of 2d or 3d points in a robust way (M-estimator technique) */
   1055 CVAPI(void)  cvFitLine( const CvArr* points, int dist_type, double param,
   1056                         double reps, double aeps, float* line );
   1057 
   1058 
   1059 
   1060 struct CvFeatureTree;
   1061 
   1062 /* Constructs kd-tree from set of feature descriptors */
   1063 CVAPI(struct CvFeatureTree*) cvCreateFeatureTree(CvMat* desc);
   1064 
   1065 /* Release kd-tree */
   1066 CVAPI(void) cvReleaseFeatureTree(struct CvFeatureTree* tr);
   1067 
   1068 /* Searches kd-tree for k nearest neighbors of given reference points,
   1069    searching at most emax leaves. */
   1070 CVAPI(void) cvFindFeatures(struct CvFeatureTree* tr, CvMat* desc,
   1071 		    CvMat* results, CvMat* dist, int k CV_DEFAULT(2), int emax CV_DEFAULT(20));
   1072 
   1073 /* Search kd-tree for all points that are inlier to given rect region. */
   1074 CVAPI(int) cvFindFeaturesBoxed(struct CvFeatureTree* tr,
   1075 		    CvMat* bounds_min, CvMat* bounds_max,
   1076 		    CvMat* results);
   1077 
   1078 typedef struct CvSURFPoint
   1079 {
   1080     CvPoint2D32f pt;
   1081     int laplacian;
   1082     int size;
   1083     float dir;
   1084     float hessian;
   1085 } CvSURFPoint;
   1086 
   1087 CV_INLINE CvSURFPoint cvSURFPoint( CvPoint2D32f pt, int laplacian,
   1088                                    int size, float dir CV_DEFAULT(0),
   1089                                    float hessian CV_DEFAULT(0))
   1090 {
   1091     CvSURFPoint kp;
   1092     kp.pt = pt;
   1093     kp.laplacian = laplacian;
   1094     kp.size = size;
   1095     kp.dir = dir;
   1096     kp.hessian = hessian;
   1097     return kp;
   1098 }
   1099 
   1100 typedef struct CvSURFParams
   1101 {
   1102     int extended;
   1103     double hessianThreshold;
   1104 
   1105     int nOctaves;
   1106     int nOctaveLayers;
   1107 }
   1108 CvSURFParams;
   1109 
   1110 CVAPI(CvSURFParams) cvSURFParams( double hessianThreshold, int extended CV_DEFAULT(0) );
   1111 CVAPI(void) cvExtractSURF( const CvArr* img, const CvArr* mask,
   1112                            CvSeq** keypoints, CvSeq** descriptors,
   1113                            CvMemStorage* storage, CvSURFParams params );
   1114 
   1115 /****************************************************************************************\
   1116 *                         Haar-like Object Detection functions                           *
   1117 \****************************************************************************************/
   1118 
   1119 /* Loads haar classifier cascade from a directory.
   1120    It is obsolete: convert your cascade to xml and use cvLoad instead */
   1121 CVAPI(CvHaarClassifierCascade*) cvLoadHaarClassifierCascade(
   1122                     const char* directory, CvSize orig_window_size);
   1123 
   1124 CVAPI(void) cvReleaseHaarClassifierCascade( CvHaarClassifierCascade** cascade );
   1125 
   1126 #define CV_HAAR_DO_CANNY_PRUNING    1
   1127 #define CV_HAAR_SCALE_IMAGE         2
   1128 #define CV_HAAR_FIND_BIGGEST_OBJECT 4
   1129 #define CV_HAAR_DO_ROUGH_SEARCH     8
   1130 
   1131 CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image,
   1132                      CvHaarClassifierCascade* cascade,
   1133                      CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1),
   1134                      int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0),
   1135                      CvSize min_size CV_DEFAULT(cvSize(0,0)));
   1136 
   1137 /* sets images for haar classifier cascade */
   1138 CVAPI(void) cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade,
   1139                                                 const CvArr* sum, const CvArr* sqsum,
   1140                                                 const CvArr* tilted_sum, double scale );
   1141 
   1142 /* runs the cascade on the specified window */
   1143 CVAPI(int) cvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade,
   1144                                       CvPoint pt, int start_stage CV_DEFAULT(0));
   1145 
   1146 
   1147 /* Alternate version that uses ints instead of floats */
   1148 CVAPI(CvSeq*) mycvHaarDetectObjects( const CvArr* image,
   1149                      CvHaarClassifierCascade* cascade,
   1150                      CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1),
   1151                      int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0),
   1152                      CvSize min_size CV_DEFAULT(cvSize(0,0)));
   1153 
   1154 CVAPI(void) mycvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade,
   1155                                                 const CvArr* sum, const CvArr* sqsum,
   1156                                                 const CvArr* tilted_sum, double scale );
   1157 
   1158 CVAPI(int) mycvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade,
   1159                                       CvPoint pt, int start_stage CV_DEFAULT(0));
   1160 
   1161 /****************************************************************************************\
   1162 *                      Camera Calibration, Pose Estimation and Stereo                    *
   1163 \****************************************************************************************/
   1164 
   1165 /* Transforms the input image to compensate lens distortion */
   1166 CVAPI(void) cvUndistort2( const CvArr* src, CvArr* dst,
   1167                           const CvMat* camera_matrix,
   1168                           const CvMat* distortion_coeffs );
   1169 
   1170 /* Computes transformation map from intrinsic camera parameters
   1171    that can used by cvRemap */
   1172 CVAPI(void) cvInitUndistortMap( const CvMat* camera_matrix,
   1173                                 const CvMat* distortion_coeffs,
   1174                                 CvArr* mapx, CvArr* mapy );
   1175 
   1176 /* Computes undistortion+rectification map for a head of stereo camera */
   1177 CVAPI(void) cvInitUndistortRectifyMap( const CvMat* camera_matrix,
   1178                                        const CvMat* dist_coeffs,
   1179                                        const CvMat *R, const CvMat* new_camera_matrix,
   1180                                        CvArr* mapx, CvArr* mapy );
   1181 
   1182 /* Computes the original (undistorted) feature coordinates
   1183    from the observed (distorted) coordinates */
   1184 CVAPI(void) cvUndistortPoints( const CvMat* src, CvMat* dst,
   1185                                const CvMat* camera_matrix,
   1186                                const CvMat* dist_coeffs,
   1187                                const CvMat* R CV_DEFAULT(0),
   1188                                const CvMat* P CV_DEFAULT(0));
   1189 
   1190 /* Converts rotation vector to rotation matrix or vice versa */
   1191 CVAPI(int) cvRodrigues2( const CvMat* src, CvMat* dst,
   1192                          CvMat* jacobian CV_DEFAULT(0) );
   1193 
   1194 #define CV_LMEDS 4
   1195 #define CV_RANSAC 8
   1196 
   1197 /* Finds perspective transformation between the object plane and image (view) plane */
   1198 CVAPI(int) cvFindHomography( const CvMat* src_points,
   1199                              const CvMat* dst_points,
   1200                              CvMat* homography,
   1201                              int method CV_DEFAULT(0),
   1202                              double ransacReprojThreshold CV_DEFAULT(0),
   1203                              CvMat* mask CV_DEFAULT(0));
   1204 
   1205 /* Computes RQ decomposition for 3x3 matrices */
   1206 CVAPI(void) cvRQDecomp3x3( const CvMat *matrixM, CvMat *matrixR, CvMat *matrixQ,
   1207                            CvMat *matrixQx CV_DEFAULT(NULL),
   1208                            CvMat *matrixQy CV_DEFAULT(NULL),
   1209                            CvMat *matrixQz CV_DEFAULT(NULL),
   1210                            CvPoint3D64f *eulerAngles CV_DEFAULT(NULL));
   1211 
   1212 /* Computes projection matrix decomposition */
   1213 CVAPI(void) cvDecomposeProjectionMatrix( const CvMat *projMatr, CvMat *calibMatr,
   1214                                          CvMat *rotMatr, CvMat *posVect,
   1215                                          CvMat *rotMatrX CV_DEFAULT(NULL),
   1216                                          CvMat *rotMatrY CV_DEFAULT(NULL),
   1217                                          CvMat *rotMatrZ CV_DEFAULT(NULL),
   1218                                          CvPoint3D64f *eulerAngles CV_DEFAULT(NULL));
   1219 
   1220 /* Computes d(AB)/dA and d(AB)/dB */
   1221 CVAPI(void) cvCalcMatMulDeriv( const CvMat* A, const CvMat* B, CvMat* dABdA, CvMat* dABdB );
   1222 
   1223 /* Computes r3 = rodrigues(rodrigues(r2)*rodrigues(r1)),
   1224    t3 = rodrigues(r2)*t1 + t2 and the respective derivatives */
   1225 CVAPI(void) cvComposeRT( const CvMat* _rvec1, const CvMat* _tvec1,
   1226                          const CvMat* _rvec2, const CvMat* _tvec2,
   1227                          CvMat* _rvec3, CvMat* _tvec3,
   1228                          CvMat* dr3dr1 CV_DEFAULT(0), CvMat* dr3dt1 CV_DEFAULT(0),
   1229                          CvMat* dr3dr2 CV_DEFAULT(0), CvMat* dr3dt2 CV_DEFAULT(0),
   1230                          CvMat* dt3dr1 CV_DEFAULT(0), CvMat* dt3dt1 CV_DEFAULT(0),
   1231                          CvMat* dt3dr2 CV_DEFAULT(0), CvMat* dt3dt2 CV_DEFAULT(0) );
   1232 
   1233 /* Projects object points to the view plane using
   1234    the specified extrinsic and intrinsic camera parameters */
   1235 CVAPI(void) cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector,
   1236                               const CvMat* translation_vector, const CvMat* camera_matrix,
   1237                               const CvMat* distortion_coeffs, CvMat* image_points,
   1238                               CvMat* dpdrot CV_DEFAULT(NULL), CvMat* dpdt CV_DEFAULT(NULL),
   1239                               CvMat* dpdf CV_DEFAULT(NULL), CvMat* dpdc CV_DEFAULT(NULL),
   1240                               CvMat* dpddist CV_DEFAULT(NULL),
   1241                               double aspect_ratio CV_DEFAULT(0));
   1242 
   1243 /* Finds extrinsic camera parameters from
   1244    a few known corresponding point pairs and intrinsic parameters */
   1245 CVAPI(void) cvFindExtrinsicCameraParams2( const CvMat* object_points,
   1246                                           const CvMat* image_points,
   1247                                           const CvMat* camera_matrix,
   1248                                           const CvMat* distortion_coeffs,
   1249                                           CvMat* rotation_vector,
   1250                                           CvMat* translation_vector );
   1251 
   1252 /* Computes initial estimate of the intrinsic camera parameters
   1253    in case of planar calibration target (e.g. chessboard) */
   1254 CVAPI(void) cvInitIntrinsicParams2D( const CvMat* object_points,
   1255                                      const CvMat* image_points,
   1256                                      const CvMat* npoints, CvSize image_size,
   1257                                      CvMat* camera_matrix,
   1258                                      double aspect_ratio CV_DEFAULT(1.) );
   1259 
   1260 #define CV_CALIB_CB_ADAPTIVE_THRESH  1
   1261 #define CV_CALIB_CB_NORMALIZE_IMAGE  2
   1262 #define CV_CALIB_CB_FILTER_QUADS     4
   1263 
   1264 /* Detects corners on a chessboard calibration pattern */
   1265 CVAPI(int) cvFindChessboardCorners( const void* image, CvSize pattern_size,
   1266                                     CvPoint2D32f* corners,
   1267                                     int* corner_count CV_DEFAULT(NULL),
   1268                                     int flags CV_DEFAULT(CV_CALIB_CB_ADAPTIVE_THRESH+
   1269                                         CV_CALIB_CB_NORMALIZE_IMAGE) );
   1270 
   1271 /* Draws individual chessboard corners or the whole chessboard detected */
   1272 CVAPI(void) cvDrawChessboardCorners( CvArr* image, CvSize pattern_size,
   1273                                      CvPoint2D32f* corners,
   1274                                      int count, int pattern_was_found );
   1275 
   1276 #define CV_CALIB_USE_INTRINSIC_GUESS  1
   1277 #define CV_CALIB_FIX_ASPECT_RATIO     2
   1278 #define CV_CALIB_FIX_PRINCIPAL_POINT  4
   1279 #define CV_CALIB_ZERO_TANGENT_DIST    8
   1280 #define CV_CALIB_FIX_FOCAL_LENGTH 16
   1281 #define CV_CALIB_FIX_K1  32
   1282 #define CV_CALIB_FIX_K2  64
   1283 #define CV_CALIB_FIX_K3  128
   1284 
   1285 /* Finds intrinsic and extrinsic camera parameters
   1286    from a few views of known calibration pattern */
   1287 CVAPI(void) cvCalibrateCamera2( const CvMat* object_points,
   1288                                 const CvMat* image_points,
   1289                                 const CvMat* point_counts,
   1290                                 CvSize image_size,
   1291                                 CvMat* camera_matrix,
   1292                                 CvMat* distortion_coeffs,
   1293                                 CvMat* rotation_vectors CV_DEFAULT(NULL),
   1294                                 CvMat* translation_vectors CV_DEFAULT(NULL),
   1295                                 int flags CV_DEFAULT(0) );
   1296 
   1297 /* Computes various useful characteristics of the camera from the data computed by
   1298    cvCalibrateCamera2 */
   1299 CVAPI(void) cvCalibrationMatrixValues( const CvMat *camera_matrix,
   1300                                 CvSize image_size,
   1301                                 double aperture_width CV_DEFAULT(0),
   1302                                 double aperture_height CV_DEFAULT(0),
   1303                                 double *fovx CV_DEFAULT(NULL),
   1304                                 double *fovy CV_DEFAULT(NULL),
   1305                                 double *focal_length CV_DEFAULT(NULL),
   1306                                 CvPoint2D64f *principal_point CV_DEFAULT(NULL),
   1307                                 double *pixel_aspect_ratio CV_DEFAULT(NULL));
   1308 
   1309 #define CV_CALIB_FIX_INTRINSIC  256
   1310 #define CV_CALIB_SAME_FOCAL_LENGTH 512
   1311 
   1312 /* Computes the transformation from one camera coordinate system to another one
   1313    from a few correspondent views of the same calibration target. Optionally, calibrates
   1314    both cameras */
   1315 CVAPI(void) cvStereoCalibrate( const CvMat* object_points, const CvMat* image_points1,
   1316                                const CvMat* image_points2, const CvMat* npoints,
   1317                                CvMat* camera_matrix1, CvMat* dist_coeffs1,
   1318                                CvMat* camera_matrix2, CvMat* dist_coeffs2,
   1319                                CvSize image_size, CvMat* R, CvMat* T,
   1320                                CvMat* E CV_DEFAULT(0), CvMat* F CV_DEFAULT(0),
   1321                                CvTermCriteria term_crit CV_DEFAULT(cvTermCriteria(
   1322                                    CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,1e-6)),
   1323                                int flags CV_DEFAULT(CV_CALIB_FIX_INTRINSIC) );
   1324 
   1325 #define CV_CALIB_ZERO_DISPARITY 1024
   1326 
   1327 /* Computes 3D rotations (+ optional shift) for each camera coordinate system to make both
   1328    views parallel (=> to make all the epipolar lines horizontal or vertical) */
   1329 CVAPI(void) cvStereoRectify( const CvMat* camera_matrix1, const CvMat* camera_matrix2,
   1330                              const CvMat* dist_coeffs1, const CvMat* dist_coeffs2,
   1331                              CvSize image_size, const CvMat* R, const CvMat* T,
   1332                              CvMat* R1, CvMat* R2, CvMat* P1, CvMat* P2,
   1333                              CvMat* Q CV_DEFAULT(0),
   1334                              int flags CV_DEFAULT(CV_CALIB_ZERO_DISPARITY) );
   1335 
   1336 /* Computes rectification transformations for uncalibrated pair of images using a set
   1337    of point correspondences */
   1338 CVAPI(int) cvStereoRectifyUncalibrated( const CvMat* points1, const CvMat* points2,
   1339                                         const CvMat* F, CvSize img_size,
   1340                                         CvMat* H1, CvMat* H2,
   1341                                         double threshold CV_DEFAULT(5));
   1342 
   1343 typedef struct CvPOSITObject CvPOSITObject;
   1344 
   1345 /* Allocates and initializes CvPOSITObject structure before doing cvPOSIT */
   1346 CVAPI(CvPOSITObject*)  cvCreatePOSITObject( CvPoint3D32f* points, int point_count );
   1347 
   1348 
   1349 /* Runs POSIT (POSe from ITeration) algorithm for determining 3d position of
   1350    an object given its model and projection in a weak-perspective case */
   1351 CVAPI(void)  cvPOSIT(  CvPOSITObject* posit_object, CvPoint2D32f* image_points,
   1352                        double focal_length, CvTermCriteria criteria,
   1353                        CvMatr32f rotation_matrix, CvVect32f translation_vector);
   1354 
   1355 /* Releases CvPOSITObject structure */
   1356 CVAPI(void)  cvReleasePOSITObject( CvPOSITObject**  posit_object );
   1357 
   1358 /* updates the number of RANSAC iterations */
   1359 CVAPI(int) cvRANSACUpdateNumIters( double p, double err_prob,
   1360                                    int model_points, int max_iters );
   1361 
   1362 CVAPI(void) cvConvertPointsHomogeneous( const CvMat* src, CvMat* dst );
   1363 
   1364 /* Calculates fundamental matrix given a set of corresponding points */
   1365 #define CV_FM_7POINT 1
   1366 #define CV_FM_8POINT 2
   1367 #define CV_FM_LMEDS_ONLY  CV_LMEDS
   1368 #define CV_FM_RANSAC_ONLY CV_RANSAC
   1369 #define CV_FM_LMEDS CV_LMEDS
   1370 #define CV_FM_RANSAC CV_RANSAC
   1371 CVAPI(int) cvFindFundamentalMat( const CvMat* points1, const CvMat* points2,
   1372                                  CvMat* fundamental_matrix,
   1373                                  int method CV_DEFAULT(CV_FM_RANSAC),
   1374                                  double param1 CV_DEFAULT(3.), double param2 CV_DEFAULT(0.99),
   1375                                  CvMat* status CV_DEFAULT(NULL) );
   1376 
   1377 /* For each input point on one of images
   1378    computes parameters of the corresponding
   1379    epipolar line on the other image */
   1380 CVAPI(void) cvComputeCorrespondEpilines( const CvMat* points,
   1381                                          int which_image,
   1382                                          const CvMat* fundamental_matrix,
   1383                                          CvMat* correspondent_lines );
   1384 
   1385 /* stereo correspondence parameters and functions */
   1386 
   1387 #define CV_STEREO_BM_NORMALIZED_RESPONSE  0
   1388 
   1389 /* Block matching algorithm structure */
   1390 typedef struct CvStereoBMState
   1391 {
   1392     // pre-filtering (normalization of input images)
   1393     int preFilterType; // =CV_STEREO_BM_NORMALIZED_RESPONSE now
   1394     int preFilterSize; // averaging window size: ~5x5..21x21
   1395     int preFilterCap; // the output of pre-filtering is clipped by [-preFilterCap,preFilterCap]
   1396 
   1397     // correspondence using Sum of Absolute Difference (SAD)
   1398     int SADWindowSize; // ~5x5..21x21
   1399     int minDisparity;  // minimum disparity (can be negative)
   1400     int numberOfDisparities; // maximum disparity - minimum disparity (> 0)
   1401 
   1402     // post-filtering
   1403     int textureThreshold;  // the disparity is only computed for pixels
   1404                            // with textured enough neighborhood
   1405     int uniquenessRatio;   // accept the computed disparity d* only if
   1406                            // SAD(d) >= SAD(d*)*(1 + uniquenessRatio/100.)
   1407                            // for any d != d*+/-1 within the search range.
   1408     int speckleWindowSize; // disparity variation window
   1409     int speckleRange; // acceptable range of variation in window
   1410 
   1411     // temporary buffers
   1412     CvMat* preFilteredImg0;
   1413     CvMat* preFilteredImg1;
   1414     CvMat* slidingSumBuf;
   1415 }
   1416 CvStereoBMState;
   1417 
   1418 #define CV_STEREO_BM_BASIC 0
   1419 #define CV_STEREO_BM_FISH_EYE 1
   1420 #define CV_STEREO_BM_NARROW 2
   1421 
   1422 CVAPI(CvStereoBMState*) cvCreateStereoBMState(int preset CV_DEFAULT(CV_STEREO_BM_BASIC),
   1423                                               int numberOfDisparities CV_DEFAULT(0));
   1424 
   1425 CVAPI(void) cvReleaseStereoBMState( CvStereoBMState** state );
   1426 
   1427 CVAPI(void) cvFindStereoCorrespondenceBM( const CvArr* left, const CvArr* right,
   1428                                           CvArr* disparity, CvStereoBMState* state );
   1429 
   1430 /* Kolmogorov-Zabin stereo-correspondence algorithm (a.k.a. KZ1) */
   1431 #define CV_STEREO_GC_OCCLUDED  SHRT_MAX
   1432 
   1433 typedef struct CvStereoGCState
   1434 {
   1435     int Ithreshold;
   1436     int interactionRadius;
   1437     float K, lambda, lambda1, lambda2;
   1438     int occlusionCost;
   1439     int minDisparity;
   1440     int numberOfDisparities;
   1441     int maxIters;
   1442 
   1443     CvMat* left;
   1444     CvMat* right;
   1445     CvMat* dispLeft;
   1446     CvMat* dispRight;
   1447     CvMat* ptrLeft;
   1448     CvMat* ptrRight;
   1449     CvMat* vtxBuf;
   1450     CvMat* edgeBuf;
   1451 }
   1452 CvStereoGCState;
   1453 
   1454 CVAPI(CvStereoGCState*) cvCreateStereoGCState( int numberOfDisparities, int maxIters );
   1455 CVAPI(void) cvReleaseStereoGCState( CvStereoGCState** state );
   1456 
   1457 CVAPI(void) cvFindStereoCorrespondenceGC( const CvArr* left, const CvArr* right,
   1458                                           CvArr* disparityLeft, CvArr* disparityRight,
   1459                                           CvStereoGCState* state,
   1460                                           int useDisparityGuess CV_DEFAULT(0) );
   1461 
   1462 /* Reprojects the computed disparity image to the 3D space using the specified 4x4 matrix */
   1463 CVAPI(void)  cvReprojectImageTo3D( const CvArr* disparityImage,
   1464                                    CvArr* _3dImage, const CvMat* Q );
   1465 
   1466 #ifdef __cplusplus
   1467 }
   1468 #endif
   1469 
   1470 #ifdef __cplusplus
   1471 #include "cv.hpp"
   1472 #endif
   1473 
   1474 /****************************************************************************************\
   1475 *                                 Backward compatibility                                 *
   1476 \****************************************************************************************/
   1477 
   1478 #ifndef CV_NO_BACKWARD_COMPATIBILITY
   1479 #include "cvcompat.h"
   1480 #endif
   1481 
   1482 #endif /*_CV_H_*/
   1483