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    A few macros and definitions for backward compatibility
     44    with the previous versions of OpenCV. They are obsolete and
     45    are likely to be removed in future. To check whether your code
     46    uses any of these, define CV_NO_BACKWARD_COMPATIBILITY before
     47    including cv.h.
     48 */
     49 
     50 #ifndef _CVCOMPAT_H_
     51 #define _CVCOMPAT_H_
     52 
     53 #include <string.h>
     54 
     55 #ifdef __cplusplus
     56     #define CV_UNREFERENCED(arg)
     57 #else
     58     #define CV_UNREFERENCED(arg) arg
     59 #endif
     60 
     61 #define CvMatType int
     62 #define CvDisMaskType int
     63 #define CvMatArray CvMat
     64 
     65 #define CvThreshType int
     66 #define CvAdaptiveThreshMethod int
     67 #define CvCompareMethod int
     68 #define CvFontFace int
     69 #define CvPolyApproxMethod int
     70 #define CvContoursMatchMethod int
     71 #define CvContourTreesMatchMethod int
     72 #define CvCoeffType int
     73 #define CvRodriguesType int
     74 #define CvElementShape int
     75 #define CvMorphOp int
     76 #define CvTemplMatchMethod int
     77 
     78 #define CvPoint2D64d CvPoint2D64f
     79 #define CvPoint3D64d CvPoint3D64f
     80 
     81 #define  CV_MAT32F      CV_32FC1
     82 #define  CV_MAT3x1_32F  CV_32FC1
     83 #define  CV_MAT4x1_32F  CV_32FC1
     84 #define  CV_MAT3x3_32F  CV_32FC1
     85 #define  CV_MAT4x4_32F  CV_32FC1
     86 
     87 #define  CV_MAT64D      CV_64FC1
     88 #define  CV_MAT3x1_64D  CV_64FC1
     89 #define  CV_MAT4x1_64D  CV_64FC1
     90 #define  CV_MAT3x3_64D  CV_64FC1
     91 #define  CV_MAT4x4_64D  CV_64FC1
     92 
     93 #define  IPL_GAUSSIAN_5x5   7
     94 #define  CvBox2D32f     CvBox2D
     95 
     96 /* allocation/deallocation macros */
     97 #define cvCreateImageData   cvCreateData
     98 #define cvReleaseImageData  cvReleaseData
     99 #define cvSetImageData      cvSetData
    100 #define cvGetImageRawData   cvGetRawData
    101 
    102 #define cvmAlloc            cvCreateData
    103 #define cvmFree             cvReleaseData
    104 #define cvmAllocArray       cvCreateData
    105 #define cvmFreeArray        cvReleaseData
    106 
    107 #define cvIntegralImage     cvIntegral
    108 #define cvMatchContours     cvMatchShapes
    109 
    110 CV_INLINE CvMat cvMatArray( int rows, int cols, int type,
    111                             int count, void* data CV_DEFAULT(0))
    112 {
    113     return cvMat( rows*count, cols, type, data );
    114 }
    115 
    116 #define cvUpdateMHIByTime  cvUpdateMotionHistory
    117 
    118 #define cvAccMask cvAcc
    119 #define cvSquareAccMask cvSquareAcc
    120 #define cvMultiplyAccMask cvMultiplyAcc
    121 #define cvRunningAvgMask(imgY, imgU, mask, alpha) cvRunningAvg(imgY, imgU, alpha, mask)
    122 
    123 #define cvSetHistThresh  cvSetHistBinRanges
    124 #define cvCalcHistMask(img, mask, hist, doNotClear) cvCalcHist(img, hist, doNotClear, mask)
    125 
    126 CV_INLINE double cvMean( const CvArr* image, const CvArr* mask CV_DEFAULT(0))
    127 {
    128     CvScalar mean = cvAvg( image, mask );
    129     return mean.val[0];
    130 }
    131 
    132 
    133 CV_INLINE double  cvSumPixels( const CvArr* image )
    134 {
    135     CvScalar scalar = cvSum( image );
    136     return scalar.val[0];
    137 }
    138 
    139 CV_INLINE void  cvMean_StdDev( const CvArr* image, double* mean, double* sdv,
    140                                const CvArr* mask CV_DEFAULT(0))
    141 {
    142     CvScalar _mean, _sdv;
    143     cvAvgSdv( image, &_mean, &_sdv, mask );
    144 
    145     if( mean )
    146         *mean = _mean.val[0];
    147 
    148     if( sdv )
    149         *sdv = _sdv.val[0];
    150 }
    151 
    152 
    153 CV_INLINE void cvmPerspectiveProject( const CvMat* mat, const CvArr* src, CvArr* dst )
    154 {
    155     CvMat tsrc, tdst;
    156 
    157     cvReshape( src, &tsrc, 3, 0 );
    158     cvReshape( dst, &tdst, 3, 0 );
    159 
    160     cvPerspectiveTransform( &tsrc, &tdst, mat );
    161 }
    162 
    163 
    164 CV_INLINE void cvFillImage( CvArr* mat, double color )
    165 {
    166     cvSet( mat, cvColorToScalar(color, cvGetElemType(mat)), 0 );
    167 }
    168 
    169 
    170 #define cvCvtPixToPlane cvSplit
    171 #define cvCvtPlaneToPix cvMerge
    172 
    173 typedef struct CvRandState
    174 {
    175     CvRNG     state;    /* RNG state (the current seed and carry)*/
    176     int       disttype; /* distribution type */
    177     CvScalar  param[2]; /* parameters of RNG */
    178 }
    179 CvRandState;
    180 
    181 
    182 /* Changes RNG range while preserving RNG state */
    183 CV_INLINE  void  cvRandSetRange( CvRandState* state, double param1,
    184                                  double param2, int index CV_DEFAULT(-1))
    185 {
    186     if( !state )
    187     {
    188         cvError( CV_StsNullPtr, "cvRandSetRange", "Null pointer to RNG state", "cvcompat.h", 0 );
    189         return;
    190     }
    191 
    192     if( (unsigned)(index + 1) > 4 )
    193     {
    194         cvError( CV_StsOutOfRange, "cvRandSetRange", "index is not in -1..3", "cvcompat.h", 0 );
    195         return;
    196     }
    197 
    198     if( index < 0 )
    199     {
    200         state->param[0].val[0] = state->param[0].val[1] =
    201         state->param[0].val[2] = state->param[0].val[3] = param1;
    202         state->param[1].val[0] = state->param[1].val[1] =
    203         state->param[1].val[2] = state->param[1].val[3] = param2;
    204     }
    205     else
    206     {
    207         state->param[0].val[index] = param1;
    208         state->param[1].val[index] = param2;
    209     }
    210 }
    211 
    212 
    213 CV_INLINE  void  cvRandInit( CvRandState* state, double param1,
    214                              double param2, int seed,
    215                              int disttype CV_DEFAULT(CV_RAND_UNI))
    216 {
    217     if( !state )
    218     {
    219         cvError( CV_StsNullPtr, "cvRandInit", "Null pointer to RNG state", "cvcompat.h", 0 );
    220         return;
    221     }
    222 
    223     if( disttype != CV_RAND_UNI && disttype != CV_RAND_NORMAL )
    224     {
    225         cvError( CV_StsBadFlag, "cvRandInit", "Unknown distribution type", "cvcompat.h", 0 );
    226         return;
    227     }
    228 
    229     state->state = (uint64)(seed ? seed : -1);
    230     state->disttype = disttype;
    231     cvRandSetRange( state, param1, param2, -1 );
    232 }
    233 
    234 
    235 /* Fills array with random numbers */
    236 CV_INLINE void cvRand( CvRandState* state, CvArr* arr )
    237 {
    238     if( !state )
    239     {
    240         cvError( CV_StsNullPtr, "cvRand", "Null pointer to RNG state", "cvcompat.h", 0 );
    241         return;
    242     }
    243     cvRandArr( &state->state, arr, state->disttype, state->param[0], state->param[1] );
    244 }
    245 
    246 #define cvRandNext( _state ) cvRandInt( &(_state)->state )
    247 
    248 CV_INLINE void cvbRand( CvRandState* state, float* dst, int len )
    249 {
    250     CvMat mat = cvMat( 1, len, CV_32F, (void*)dst );
    251     cvRand( state, &mat );
    252 }
    253 
    254 
    255 CV_INLINE void  cvbCartToPolar( const float* y, const float* x,
    256                                 float* magnitude, float* angle, int len )
    257 {
    258     CvMat mx = cvMat( 1, len, CV_32F, (void*)x );
    259     CvMat my = mx;
    260     CvMat mm = mx;
    261     CvMat ma = mx;
    262 
    263     my.data.fl = (float*)y;
    264     mm.data.fl = (float*)magnitude;
    265     ma.data.fl = (float*)angle;
    266 
    267     cvCartToPolar( &mx, &my, &mm, angle ? &ma : NULL, 1 );
    268 }
    269 
    270 
    271 CV_INLINE void  cvbFastArctan( const float* y, const float* x,
    272                                float* angle, int len )
    273 {
    274     CvMat mx = cvMat( 1, len, CV_32F, (void*)x );
    275     CvMat my = mx;
    276     CvMat ma = mx;
    277 
    278     my.data.fl = (float*)y;
    279     ma.data.fl = (float*)angle;
    280 
    281     cvCartToPolar( &mx, &my, NULL, &ma, 1 );
    282 }
    283 
    284 
    285 CV_INLINE  void  cvbSqrt( const float* x, float* y, int len )
    286 {
    287     CvMat mx = cvMat( 1, len, CV_32F, (void*)x );
    288     CvMat my = mx;
    289     my.data.fl = (float*)y;
    290 
    291     cvPow( &mx, &my, 0.5 );
    292 }
    293 
    294 
    295 CV_INLINE  void  cvbInvSqrt( const float* x, float* y, int len )
    296 {
    297     CvMat mx = cvMat( 1, len, CV_32F, (void*)x );
    298     CvMat my = mx;
    299     my.data.fl = (float*)y;
    300 
    301     cvPow( &mx, &my, -0.5 );
    302 }
    303 
    304 
    305 CV_INLINE  void  cvbReciprocal( const float* x, float* y, int len )
    306 {
    307     CvMat mx = cvMat( 1, len, CV_32F, (void*)x );
    308     CvMat my = mx;
    309     my.data.fl = (float*)y;
    310 
    311     cvPow( &mx, &my, -1 );
    312 }
    313 
    314 
    315 CV_INLINE  void  cvbFastExp( const float* x, double* y, int len )
    316 {
    317     CvMat mx = cvMat( 1, len, CV_32F, (void*)x );
    318     CvMat my = cvMat( 1, len, CV_64F, y );
    319     cvExp( &mx, &my );
    320 }
    321 
    322 
    323 CV_INLINE  void  cvbFastLog( const double* x, float* y, int len )
    324 {
    325     CvMat mx = cvMat( 1, len, CV_64F, (void*)x );
    326     CvMat my = cvMat( 1, len, CV_32F, y );
    327     cvLog( &mx, &my );
    328 }
    329 
    330 
    331 CV_INLINE  CvRect  cvContourBoundingRect( void* point_set, int update CV_DEFAULT(0))
    332 {
    333     return cvBoundingRect( point_set, update );
    334 }
    335 
    336 
    337 CV_INLINE double cvPseudoInverse( const CvArr* src, CvArr* dst )
    338 {
    339     return cvInvert( src, dst, CV_SVD );
    340 }
    341 
    342 #define cvPseudoInv cvPseudoInverse
    343 
    344 #define cvContourMoments( contour, moments ) \
    345     cvMoments( contour, moments, 0 )
    346 
    347 #define cvGetPtrAt              cvPtr2D
    348 #define cvGetAt                 cvGet2D
    349 #define cvSetAt(arr,val,y,x)    cvSet2D((arr),(y),(x),(val))
    350 
    351 #define cvMeanMask  cvMean
    352 #define cvMean_StdDevMask(img,mask,mean,sdv) cvMean_StdDev(img,mean,sdv,mask)
    353 
    354 #define cvNormMask(imgA,imgB,mask,normType) cvNorm(imgA,imgB,normType,mask)
    355 
    356 #define cvMinMaxLocMask(img, mask, min_val, max_val, min_loc, max_loc) \
    357         cvMinMaxLoc(img, min_val, max_val, min_loc, max_loc, mask)
    358 
    359 #define cvRemoveMemoryManager  cvSetMemoryManager
    360 
    361 #define cvmSetZero( mat )               cvSetZero( mat )
    362 #define cvmSetIdentity( mat )           cvSetIdentity( mat )
    363 #define cvmAdd( src1, src2, dst )       cvAdd( src1, src2, dst, 0 )
    364 #define cvmSub( src1, src2, dst )       cvSub( src1, src2, dst, 0 )
    365 #define cvmCopy( src, dst )             cvCopy( src, dst, 0 )
    366 #define cvmMul( src1, src2, dst )       cvMatMulAdd( src1, src2, 0, dst )
    367 #define cvmTranspose( src, dst )        cvT( src, dst )
    368 #define cvmInvert( src, dst )           cvInv( src, dst )
    369 #define cvmMahalanobis(vec1, vec2, mat) cvMahalanobis( vec1, vec2, mat )
    370 #define cvmDotProduct( vec1, vec2 )     cvDotProduct( vec1, vec2 )
    371 #define cvmCrossProduct(vec1, vec2,dst) cvCrossProduct( vec1, vec2, dst )
    372 #define cvmTrace( mat )                 (cvTrace( mat )).val[0]
    373 #define cvmMulTransposed( src, dst, order ) cvMulTransposed( src, dst, order )
    374 #define cvmEigenVV( mat, evec, eval, eps)   cvEigenVV( mat, evec, eval, eps )
    375 #define cvmDet( mat )                   cvDet( mat )
    376 #define cvmScale( src, dst, scale )     cvScale( src, dst, scale )
    377 
    378 #define cvCopyImage( src, dst )         cvCopy( src, dst, 0 )
    379 #define cvReleaseMatHeader              cvReleaseMat
    380 
    381 /* Calculates exact convex hull of 2d point set */
    382 CV_INLINE void cvConvexHull( CvPoint* points, int num_points,
    383                              CvRect* CV_UNREFERENCED(bound_rect),
    384                              int orientation, int* hull, int* hullsize )
    385 {
    386     CvMat points1 = cvMat( 1, num_points, CV_32SC2, points );
    387     CvMat hull1 = cvMat( 1, num_points, CV_32SC1, hull );
    388 
    389     cvConvexHull2( &points1, &hull1, orientation, 0 );
    390     *hullsize = hull1.cols;
    391 }
    392 
    393 /* Calculates exact convex hull of 2d point set stored in a sequence */
    394 #define cvContourConvexHull( contour, orientation, storage ) \
    395     cvConvexHull2( contour, storage, orientation )
    396 
    397 /* Calculates approximate convex hull of 2d point set */
    398 #define cvConvexHullApprox( points, num_points, bound_rect, bandwidth,      \
    399                             orientation, hull, hullsize )                   \
    400 cvConvexHull( points, num_points, bound_rect, orientation, hull, hullsize )
    401 
    402 /* Calculates approximate convex hull of 2d point set stored in a sequence */
    403 #define cvContourConvexHullApprox( contour, bandwidth, orientation, storage )   \
    404     cvConvexHull2( contour, storage, orientation )
    405 
    406 
    407 CV_INLINE void cvMinAreaRect( CvPoint* points, int n,
    408                               int CV_UNREFERENCED(left), int CV_UNREFERENCED(bottom),
    409                               int CV_UNREFERENCED(right), int CV_UNREFERENCED(top),
    410                               CvPoint2D32f* anchor,
    411                               CvPoint2D32f* vect1,
    412                               CvPoint2D32f* vect2 )
    413 {
    414     CvMat mat = cvMat( 1, n, CV_32SC2, points );
    415     CvBox2D box = cvMinAreaRect2( &mat, 0 );
    416     CvPoint2D32f pt[4];
    417 
    418     cvBoxPoints( box, pt );
    419     *anchor = pt[0];
    420     vect1->x = pt[1].x - pt[0].x;
    421     vect1->y = pt[1].y - pt[0].y;
    422     vect2->x = pt[3].x - pt[0].x;
    423     vect2->y = pt[3].y - pt[0].y;
    424 
    425     CV_UNREFERENCED( (left, bottom, right, top) );
    426 }
    427 
    428 typedef int CvDisType;
    429 typedef int CvChainApproxMethod;
    430 typedef int CvContourRetrievalMode;
    431 
    432 CV_INLINE  void  cvFitLine3D( CvPoint3D32f* points, int count, int dist,
    433                               void *param, float reps, float aeps, float* line )
    434 {
    435     CvMat mat = cvMat( 1, count, CV_32FC3, points );
    436     float _param = param != NULL ? *(float*)param : 0.f;
    437     assert( dist != CV_DIST_USER );
    438     cvFitLine( &mat, dist, _param, reps, aeps, line );
    439 }
    440 
    441 /* Fits a line into set of 2d points in a robust way (M-estimator technique) */
    442 CV_INLINE  void  cvFitLine2D( CvPoint2D32f* points, int count, int dist,
    443                               void *param, float reps, float aeps, float* line )
    444 {
    445     CvMat mat = cvMat( 1, count, CV_32FC2, points );
    446     float _param = param != NULL ? *(float*)param : 0.f;
    447     assert( dist != CV_DIST_USER );
    448     cvFitLine( &mat, dist, _param, reps, aeps, line );
    449 }
    450 
    451 
    452 CV_INLINE  void cvFitEllipse( const CvPoint2D32f* points, int count, CvBox2D* box )
    453 {
    454     CvMat mat = cvMat( 1, count, CV_32FC2, (void*)points );
    455     *box = cvFitEllipse2( &mat );
    456 }
    457 
    458 /* Projects 2d points to one of standard coordinate planes
    459    (i.e. removes one of coordinates) */
    460 CV_INLINE  void  cvProject3D( CvPoint3D32f* points3D, int count,
    461                               CvPoint2D32f* points2D,
    462                               int xIndx CV_DEFAULT(0),
    463                               int yIndx CV_DEFAULT(1))
    464 {
    465     CvMat src = cvMat( 1, count, CV_32FC3, points3D );
    466     CvMat dst = cvMat( 1, count, CV_32FC2, points2D );
    467     float m[6] = {0,0,0,0,0,0};
    468     CvMat M = cvMat( 2, 3, CV_32F, m );
    469 
    470     assert( (unsigned)xIndx < 3 && (unsigned)yIndx < 3 );
    471     m[xIndx] = m[yIndx+3] = 1.f;
    472 
    473     cvTransform( &src, &dst, &M, NULL );
    474 }
    475 
    476 
    477 /* Retrieves value of the particular bin
    478    of x-dimensional (x=1,2,3,...) histogram */
    479 #define cvQueryHistValue_1D( hist, idx0 ) \
    480     ((float)cvGetReal1D( (hist)->bins, (idx0)))
    481 #define cvQueryHistValue_2D( hist, idx0, idx1 ) \
    482     ((float)cvGetReal2D( (hist)->bins, (idx0), (idx1)))
    483 #define cvQueryHistValue_3D( hist, idx0, idx1, idx2 ) \
    484     ((float)cvGetReal3D( (hist)->bins, (idx0), (idx1), (idx2)))
    485 #define cvQueryHistValue_nD( hist, idx ) \
    486     ((float)cvGetRealND( (hist)->bins, (idx)))
    487 
    488 /* Returns pointer to the particular bin of x-dimesional histogram.
    489    For sparse histogram the bin is created if it didn't exist before */
    490 #define cvGetHistValue_1D( hist, idx0 ) \
    491     ((float*)cvPtr1D( (hist)->bins, (idx0), 0))
    492 #define cvGetHistValue_2D( hist, idx0, idx1 ) \
    493     ((float*)cvPtr2D( (hist)->bins, (idx0), (idx1), 0))
    494 #define cvGetHistValue_3D( hist, idx0, idx1, idx2 ) \
    495     ((float*)cvPtr3D( (hist)->bins, (idx0), (idx1), (idx2), 0))
    496 #define cvGetHistValue_nD( hist, idx ) \
    497     ((float*)cvPtrND( (hist)->bins, (idx), 0))
    498 
    499 
    500 #define CV_IS_SET_ELEM_EXISTS CV_IS_SET_ELEM
    501 
    502 
    503 CV_INLINE  int  cvHoughLines( CvArr* image, double rho,
    504                               double theta, int threshold,
    505                               float* lines, int linesNumber )
    506 {
    507     CvMat linesMat = cvMat( 1, linesNumber, CV_32FC2, lines );
    508     cvHoughLines2( image, &linesMat, CV_HOUGH_STANDARD,
    509                    rho, theta, threshold, 0, 0 );
    510 
    511     return linesMat.cols;
    512 }
    513 
    514 
    515 CV_INLINE  int  cvHoughLinesP( CvArr* image, double rho,
    516                                double theta, int threshold,
    517                                int lineLength, int lineGap,
    518                                int* lines, int linesNumber )
    519 {
    520     CvMat linesMat = cvMat( 1, linesNumber, CV_32SC4, lines );
    521     cvHoughLines2( image, &linesMat, CV_HOUGH_PROBABILISTIC,
    522                    rho, theta, threshold, lineLength, lineGap );
    523 
    524     return linesMat.cols;
    525 }
    526 
    527 
    528 CV_INLINE  int  cvHoughLinesSDiv( CvArr* image, double rho, int srn,
    529                                   double theta, int stn, int threshold,
    530                                   float* lines, int linesNumber )
    531 {
    532     CvMat linesMat = cvMat( 1, linesNumber, CV_32FC2, lines );
    533     cvHoughLines2( image, &linesMat, CV_HOUGH_MULTI_SCALE,
    534                    rho, theta, threshold, srn, stn );
    535 
    536     return linesMat.cols;
    537 }
    538 
    539 
    540 /* Find fundamental matrix */
    541 CV_INLINE  void  cvFindFundamentalMatrix( int* points1, int* points2,
    542                             int numpoints, int CV_UNREFERENCED(method), float* matrix )
    543 {
    544     CvMat* pointsMat1;
    545     CvMat* pointsMat2;
    546     CvMat fundMatr = cvMat(3,3,CV_32F,matrix);
    547     int i, curr = 0;
    548 
    549     pointsMat1 = cvCreateMat(3,numpoints,CV_64F);
    550     pointsMat2 = cvCreateMat(3,numpoints,CV_64F);
    551 
    552     for( i = 0; i < numpoints; i++ )
    553     {
    554         cvmSet(pointsMat1,0,i,points1[curr]);//x
    555         cvmSet(pointsMat1,1,i,points1[curr+1]);//y
    556         cvmSet(pointsMat1,2,i,1.0);
    557 
    558         cvmSet(pointsMat2,0,i,points2[curr]);//x
    559         cvmSet(pointsMat2,1,i,points2[curr+1]);//y
    560         cvmSet(pointsMat2,2,i,1.0);
    561         curr += 2;
    562     }
    563 
    564     cvFindFundamentalMat(pointsMat1,pointsMat2,&fundMatr,CV_FM_RANSAC,1,0.99,0);
    565 
    566     cvReleaseMat(&pointsMat1);
    567     cvReleaseMat(&pointsMat2);
    568 }
    569 
    570 
    571 
    572 CV_INLINE int
    573 cvFindChessBoardCornerGuesses( const void* arr, void* CV_UNREFERENCED(thresharr),
    574                                CvMemStorage * CV_UNREFERENCED(storage),
    575                                CvSize pattern_size, CvPoint2D32f * corners,
    576                                int *corner_count )
    577 {
    578     return cvFindChessboardCorners( arr, pattern_size, corners,
    579                                     corner_count, CV_CALIB_CB_ADAPTIVE_THRESH );
    580 }
    581 
    582 
    583 /* Calibrates camera using multiple views of calibration pattern */
    584 CV_INLINE void cvCalibrateCamera( int image_count, int* _point_counts,
    585     CvSize image_size, CvPoint2D32f* _image_points, CvPoint3D32f* _object_points,
    586     float* _distortion_coeffs, float* _camera_matrix, float* _translation_vectors,
    587     float* _rotation_matrices, int flags )
    588 {
    589     int i, total = 0;
    590     CvMat point_counts = cvMat( image_count, 1, CV_32SC1, _point_counts );
    591     CvMat image_points, object_points;
    592     CvMat dist_coeffs = cvMat( 4, 1, CV_32FC1, _distortion_coeffs );
    593     CvMat camera_matrix = cvMat( 3, 3, CV_32FC1, _camera_matrix );
    594     CvMat rotation_matrices = cvMat( image_count, 9, CV_32FC1, _rotation_matrices );
    595     CvMat translation_vectors = cvMat( image_count, 3, CV_32FC1, _translation_vectors );
    596 
    597     for( i = 0; i < image_count; i++ )
    598         total += _point_counts[i];
    599 
    600     image_points = cvMat( total, 1, CV_32FC2, _image_points );
    601     object_points = cvMat( total, 1, CV_32FC3, _object_points );
    602 
    603     cvCalibrateCamera2( &object_points, &image_points, &point_counts, image_size,
    604         &camera_matrix, &dist_coeffs, &rotation_matrices, &translation_vectors,
    605         flags );
    606 }
    607 
    608 
    609 CV_INLINE void cvCalibrateCamera_64d( int image_count, int* _point_counts,
    610     CvSize image_size, CvPoint2D64f* _image_points, CvPoint3D64f* _object_points,
    611     double* _distortion_coeffs, double* _camera_matrix, double* _translation_vectors,
    612     double* _rotation_matrices, int flags )
    613 {
    614     int i, total = 0;
    615     CvMat point_counts = cvMat( image_count, 1, CV_32SC1, _point_counts );
    616     CvMat image_points, object_points;
    617     CvMat dist_coeffs = cvMat( 4, 1, CV_64FC1, _distortion_coeffs );
    618     CvMat camera_matrix = cvMat( 3, 3, CV_64FC1, _camera_matrix );
    619     CvMat rotation_matrices = cvMat( image_count, 9, CV_64FC1, _rotation_matrices );
    620     CvMat translation_vectors = cvMat( image_count, 3, CV_64FC1, _translation_vectors );
    621 
    622     for( i = 0; i < image_count; i++ )
    623         total += _point_counts[i];
    624 
    625     image_points = cvMat( total, 1, CV_64FC2, _image_points );
    626     object_points = cvMat( total, 1, CV_64FC3, _object_points );
    627 
    628     cvCalibrateCamera2( &object_points, &image_points, &point_counts, image_size,
    629         &camera_matrix, &dist_coeffs, &rotation_matrices, &translation_vectors,
    630         flags );
    631 }
    632 
    633 
    634 
    635 /* Find 3d position of object given intrinsic camera parameters,
    636    3d model of the object and projection of the object into view plane */
    637 CV_INLINE void cvFindExtrinsicCameraParams( int point_count,
    638     CvSize CV_UNREFERENCED(image_size), CvPoint2D32f* _image_points,
    639     CvPoint3D32f* _object_points, float* focal_length,
    640     CvPoint2D32f principal_point, float* _distortion_coeffs,
    641     float* _rotation_vector, float* _translation_vector )
    642 {
    643     CvMat image_points = cvMat( point_count, 1, CV_32FC2, _image_points );
    644     CvMat object_points = cvMat( point_count, 1, CV_32FC3, _object_points );
    645     CvMat dist_coeffs = cvMat( 4, 1, CV_32FC1, _distortion_coeffs );
    646     float a[9];
    647     CvMat camera_matrix = cvMat( 3, 3, CV_32FC1, a );
    648     CvMat rotation_vector = cvMat( 1, 1, CV_32FC3, _rotation_vector );
    649     CvMat translation_vector = cvMat( 1, 1, CV_32FC3, _translation_vector );
    650 
    651     a[0] = focal_length[0]; a[4] = focal_length[1];
    652     a[2] = principal_point.x; a[5] = principal_point.y;
    653     a[1] = a[3] = a[6] = a[7] = 0.f;
    654     a[8] = 1.f;
    655 
    656     cvFindExtrinsicCameraParams2( &object_points, &image_points, &camera_matrix,
    657         &dist_coeffs, &rotation_vector, &translation_vector );
    658 }
    659 
    660 
    661 /* Variant of the previous function that takes double-precision parameters */
    662 CV_INLINE void cvFindExtrinsicCameraParams_64d( int point_count,
    663     CvSize CV_UNREFERENCED(image_size), CvPoint2D64f* _image_points,
    664     CvPoint3D64f* _object_points, double* focal_length,
    665     CvPoint2D64f principal_point, double* _distortion_coeffs,
    666     double* _rotation_vector, double* _translation_vector )
    667 {
    668     CvMat image_points = cvMat( point_count, 1, CV_64FC2, _image_points );
    669     CvMat object_points = cvMat( point_count, 1, CV_64FC3, _object_points );
    670     CvMat dist_coeffs = cvMat( 4, 1, CV_64FC1, _distortion_coeffs );
    671     double a[9];
    672     CvMat camera_matrix = cvMat( 3, 3, CV_64FC1, a );
    673     CvMat rotation_vector = cvMat( 1, 1, CV_64FC3, _rotation_vector );
    674     CvMat translation_vector = cvMat( 1, 1, CV_64FC3, _translation_vector );
    675 
    676     a[0] = focal_length[0]; a[4] = focal_length[1];
    677     a[2] = principal_point.x; a[5] = principal_point.y;
    678     a[1] = a[3] = a[6] = a[7] = 0.;
    679     a[8] = 1.;
    680 
    681     cvFindExtrinsicCameraParams2( &object_points, &image_points, &camera_matrix,
    682         &dist_coeffs, &rotation_vector, &translation_vector );
    683 }
    684 
    685 
    686 /* Rodrigues transform */
    687 #define CV_RODRIGUES_M2V  0
    688 #define CV_RODRIGUES_V2M  1
    689 
    690 /* Converts rotation_matrix matrix to rotation_matrix vector or vice versa */
    691 CV_INLINE void  cvRodrigues( CvMat* rotation_matrix, CvMat* rotation_vector,
    692                              CvMat* jacobian, int conv_type )
    693 {
    694     if( conv_type == CV_RODRIGUES_V2M )
    695         cvRodrigues2( rotation_vector, rotation_matrix, jacobian );
    696     else
    697         cvRodrigues2( rotation_matrix, rotation_vector, jacobian );
    698 }
    699 
    700 
    701 /* Does reprojection of 3d object points to the view plane */
    702 CV_INLINE void  cvProjectPoints( int point_count, CvPoint3D64f* _object_points,
    703     double* _rotation_vector, double*  _translation_vector,
    704     double* focal_length, CvPoint2D64f principal_point,
    705     double* _distortion, CvPoint2D64f* _image_points,
    706     double* _deriv_points_rotation_matrix,
    707     double* _deriv_points_translation_vect,
    708     double* _deriv_points_focal,
    709     double* _deriv_points_principal_point,
    710     double* _deriv_points_distortion_coeffs )
    711 {
    712     CvMat object_points = cvMat( point_count, 1, CV_64FC3, _object_points );
    713     CvMat image_points = cvMat( point_count, 1, CV_64FC2, _image_points );
    714     CvMat rotation_vector = cvMat( 3, 1, CV_64FC1, _rotation_vector );
    715     CvMat translation_vector = cvMat( 3, 1, CV_64FC1, _translation_vector );
    716     double a[9];
    717     CvMat camera_matrix = cvMat( 3, 3, CV_64FC1, a );
    718     CvMat dist_coeffs = cvMat( 4, 1, CV_64FC1, _distortion );
    719     CvMat dpdr = cvMat( 2*point_count, 3, CV_64FC1, _deriv_points_rotation_matrix );
    720     CvMat dpdt = cvMat( 2*point_count, 3, CV_64FC1, _deriv_points_translation_vect );
    721     CvMat dpdf = cvMat( 2*point_count, 2, CV_64FC1, _deriv_points_focal );
    722     CvMat dpdc = cvMat( 2*point_count, 2, CV_64FC1, _deriv_points_principal_point );
    723     CvMat dpdk = cvMat( 2*point_count, 4, CV_64FC1, _deriv_points_distortion_coeffs );
    724 
    725     a[0] = focal_length[0]; a[4] = focal_length[1];
    726     a[2] = principal_point.x; a[5] = principal_point.y;
    727     a[1] = a[3] = a[6] = a[7] = 0.;
    728     a[8] = 1.;
    729 
    730     cvProjectPoints2( &object_points, &rotation_vector, &translation_vector,
    731                       &camera_matrix, &dist_coeffs, &image_points,
    732                       &dpdr, &dpdt, &dpdf, &dpdc, &dpdk, 0 );
    733 }
    734 
    735 
    736 /* Simpler version of the previous function */
    737 CV_INLINE void  cvProjectPointsSimple( int point_count, CvPoint3D64f* _object_points,
    738     double* _rotation_matrix, double*  _translation_vector,
    739     double* _camera_matrix, double* _distortion, CvPoint2D64f* _image_points )
    740 {
    741     CvMat object_points = cvMat( point_count, 1, CV_64FC3, _object_points );
    742     CvMat image_points = cvMat( point_count, 1, CV_64FC2, _image_points );
    743     CvMat rotation_matrix = cvMat( 3, 3, CV_64FC1, _rotation_matrix );
    744     CvMat translation_vector = cvMat( 3, 1, CV_64FC1, _translation_vector );
    745     CvMat camera_matrix = cvMat( 3, 3, CV_64FC1, _camera_matrix );
    746     CvMat dist_coeffs = cvMat( 4, 1, CV_64FC1, _distortion );
    747 
    748     cvProjectPoints2( &object_points, &rotation_matrix, &translation_vector,
    749                       &camera_matrix, &dist_coeffs, &image_points,
    750                       0, 0, 0, 0, 0, 0 );
    751 }
    752 
    753 
    754 CV_INLINE void cvUnDistortOnce( const CvArr* src, CvArr* dst,
    755                                 const float* intrinsic_matrix,
    756                                 const float* distortion_coeffs,
    757                                 int CV_UNREFERENCED(interpolate) )
    758 {
    759     CvMat _a = cvMat( 3, 3, CV_32F, (void*)intrinsic_matrix );
    760     CvMat _k = cvMat( 4, 1, CV_32F, (void*)distortion_coeffs );
    761     cvUndistort2( src, dst, &_a, &_k );
    762 }
    763 
    764 
    765 /* the two functions below have quite hackerish implementations, use with care
    766    (or, which is better, switch to cvUndistortInitMap and cvRemap instead */
    767 CV_INLINE void cvUnDistortInit( const CvArr* CV_UNREFERENCED(src),
    768                                 CvArr* undistortion_map,
    769                                 const float* A, const float* k,
    770                                 int CV_UNREFERENCED(interpolate) )
    771 {
    772     union { uchar* ptr; float* fl; } data;
    773     CvSize sz;
    774     cvGetRawData( undistortion_map, &data.ptr, 0, &sz );
    775     assert( sz.width >= 8 );
    776     /* just save the intrinsic parameters to the map */
    777     data.fl[0] = A[0]; data.fl[1] = A[4];
    778     data.fl[2] = A[2]; data.fl[3] = A[5];
    779     data.fl[4] = k[0]; data.fl[5] = k[1];
    780     data.fl[6] = k[2]; data.fl[7] = k[3];
    781 }
    782 
    783 CV_INLINE void  cvUnDistort( const CvArr* src, CvArr* dst,
    784                              const CvArr* undistortion_map,
    785                              int CV_UNREFERENCED(interpolate) )
    786 {
    787     union { uchar* ptr; float* fl; } data;
    788     float a[] = {0,0,0,0,0,0,0,0,1};
    789     CvSize sz;
    790     cvGetRawData( undistortion_map, &data.ptr, 0, &sz );
    791     assert( sz.width >= 8 );
    792     a[0] = data.fl[0]; a[4] = data.fl[1];
    793     a[2] = data.fl[2]; a[5] = data.fl[3];
    794     cvUnDistortOnce( src, dst, a, data.fl + 4, 1 );
    795 }
    796 
    797 
    798 CV_INLINE  float  cvCalcEMD( const float* signature1, int size1,
    799                              const float* signature2, int size2,
    800                              int dims, int dist_type CV_DEFAULT(CV_DIST_L2),
    801                              CvDistanceFunction dist_func CV_DEFAULT(0),
    802                              float* lower_bound CV_DEFAULT(0),
    803                              void* user_param CV_DEFAULT(0))
    804 {
    805     CvMat sign1 = cvMat( size1, dims + 1, CV_32FC1, (void*)signature1 );
    806     CvMat sign2 = cvMat( size2, dims + 1, CV_32FC1, (void*)signature2 );
    807 
    808     return cvCalcEMD2( &sign1, &sign2, dist_type, dist_func, 0, 0, lower_bound, user_param );
    809 }
    810 
    811 
    812 CV_INLINE  void  cvKMeans( int num_clusters, float** samples,
    813                            int num_samples, int vec_size,
    814                            CvTermCriteria termcrit, int* cluster_idx )
    815 {
    816     CvMat* samples_mat = cvCreateMat( num_samples, vec_size, CV_32FC1 );
    817     CvMat cluster_idx_mat = cvMat( num_samples, 1, CV_32SC1, cluster_idx );
    818     int i;
    819     for( i = 0; i < num_samples; i++ )
    820         memcpy( samples_mat->data.fl + i*vec_size, samples[i], vec_size*sizeof(float));
    821     cvKMeans2( samples_mat, num_clusters, &cluster_idx_mat, termcrit );
    822     cvReleaseMat( &samples_mat );
    823 }
    824 
    825 
    826 CV_INLINE void  cvStartScanGraph( CvGraph* graph, CvGraphScanner* scanner,
    827                                   CvGraphVtx* vtx CV_DEFAULT(NULL),
    828                                   int mask CV_DEFAULT(CV_GRAPH_ALL_ITEMS))
    829 {
    830     CvGraphScanner* temp_scanner;
    831 
    832     if( !scanner )
    833         cvError( CV_StsNullPtr, "cvStartScanGraph", "Null scanner pointer", "cvcompat.h", 0 );
    834 
    835     temp_scanner = cvCreateGraphScanner( graph, vtx, mask );
    836     *scanner = *temp_scanner;
    837     cvFree( &temp_scanner );
    838 }
    839 
    840 
    841 CV_INLINE  void  cvEndScanGraph( CvGraphScanner* scanner )
    842 {
    843     if( !scanner )
    844         cvError( CV_StsNullPtr, "cvEndScanGraph", "Null scanner pointer", "cvcompat.h", 0 );
    845 
    846     if( scanner->stack )
    847     {
    848         CvGraphScanner* temp_scanner = (CvGraphScanner*)cvAlloc( sizeof(*temp_scanner) );
    849         *temp_scanner = *scanner;
    850         cvReleaseGraphScanner( &temp_scanner );
    851         memset( scanner, 0, sizeof(*scanner) );
    852     }
    853 }
    854 
    855 
    856 #define cvKalmanUpdateByTime  cvKalmanPredict
    857 #define cvKalmanUpdateByMeasurement cvKalmanCorrect
    858 
    859 /* old drawing functions */
    860 CV_INLINE  void  cvLineAA( CvArr* img, CvPoint pt1, CvPoint pt2,
    861                            double color, int scale CV_DEFAULT(0))
    862 {
    863     cvLine( img, pt1, pt2, cvColorToScalar(color, cvGetElemType(img)), 1, CV_AA, scale );
    864 }
    865 
    866 CV_INLINE  void  cvCircleAA( CvArr* img, CvPoint center, int radius,
    867                              double color, int scale CV_DEFAULT(0) )
    868 {
    869     cvCircle( img, center, radius, cvColorToScalar(color, cvGetElemType(img)), 1, CV_AA, scale );
    870 }
    871 
    872 CV_INLINE  void  cvEllipseAA( CvArr* img, CvPoint center, CvSize axes,
    873                               double angle, double start_angle,
    874                               double end_angle, double color,
    875                               int scale CV_DEFAULT(0) )
    876 {
    877     cvEllipse( img, center, axes, angle, start_angle, end_angle,
    878                cvColorToScalar(color, cvGetElemType(img)), 1, CV_AA, scale );
    879 }
    880 
    881 CV_INLINE  void  cvPolyLineAA( CvArr* img, CvPoint** pts, int* npts, int contours,
    882                                int is_closed, double color, int scale CV_DEFAULT(0) )
    883 {
    884     cvPolyLine( img, pts, npts, contours, is_closed,
    885                 cvColorToScalar(color, cvGetElemType(img)),
    886                 1, CV_AA, scale );
    887 }
    888 
    889 
    890 #define cvMake2DPoints cvConvertPointsHomogeneous
    891 #define cvMake3DPoints cvConvertPointsHomogeneous
    892 
    893 #define cvWarpPerspectiveQMatrix cvGetPerspectiveTransform
    894 
    895 #define cvConvertPointsHomogenious cvConvertPointsHomogeneous
    896 
    897 /****************************************************************************************\
    898 *                                   Pixel Access Macros                                  *
    899 \****************************************************************************************/
    900 
    901 typedef struct _CvPixelPosition8u
    902 {
    903     uchar*  currline;      /* pointer to the start of the current pixel line   */
    904     uchar*  topline;       /* pointer to the start of the top pixel line       */
    905     uchar*  bottomline;    /* pointer to the start of the first line           */
    906                                     /* which is below the image                         */
    907     int     x;                      /* current x coordinate ( in pixels )               */
    908     int     width;                  /* width of the image  ( in pixels )                */
    909     int     height;                 /* height of the image  ( in pixels )               */
    910     int     step;                   /* distance between lines ( in elements of single   */
    911                                     /* plane )                                          */
    912     int     step_arr[3];            /* array: ( 0, -step, step ). It is used for        */
    913                                     /* vertical moving                                  */
    914 } CvPixelPosition8u;
    915 
    916 /* this structure differs from the above only in data type */
    917 typedef struct _CvPixelPosition8s
    918 {
    919     schar*  currline;
    920     schar*  topline;
    921     schar*  bottomline;
    922     int     x;
    923     int     width;
    924     int     height;
    925     int     step;
    926     int     step_arr[3];
    927 } CvPixelPosition8s;
    928 
    929 /* this structure differs from the CvPixelPosition8u only in data type */
    930 typedef struct _CvPixelPosition32f
    931 {
    932     float*  currline;
    933     float*  topline;
    934     float*  bottomline;
    935     int     x;
    936     int     width;
    937     int     height;
    938     int     step;
    939     int     step_arr[3];
    940 } CvPixelPosition32f;
    941 
    942 
    943 /* Initialize one of the CvPixelPosition structures.   */
    944 /*  pos    - initialized structure                     */
    945 /*  origin - pointer to the left-top corner of the ROI */
    946 /*  step   - width of the whole image in bytes         */
    947 /*  roi    - width & height of the ROI                 */
    948 /*  x, y   - initial position                          */
    949 #define CV_INIT_PIXEL_POS(pos, origin, _step, roi, _x, _y, orientation)    \
    950     (                                                                        \
    951     (pos).step = (_step)/sizeof((pos).currline[0]) * (orientation ? -1 : 1), \
    952     (pos).width = (roi).width,                                               \
    953     (pos).height = (roi).height,                                             \
    954     (pos).bottomline = (origin) + (pos).step*(pos).height,                   \
    955     (pos).topline = (origin) - (pos).step,                                   \
    956     (pos).step_arr[0] = 0,                                                   \
    957     (pos).step_arr[1] = -(pos).step,                                         \
    958     (pos).step_arr[2] = (pos).step,                                          \
    959     (pos).x = (_x),                                                          \
    960     (pos).currline = (origin) + (pos).step*(_y) )
    961 
    962 
    963 /* Move to specified point ( absolute shift ) */
    964 /*  pos    - position structure               */
    965 /*  x, y   - coordinates of the new position  */
    966 /*  cs     - number of the image channels     */
    967 #define CV_MOVE_TO( pos, _x, _y, cs )                                                   \
    968 ((pos).currline = (_y) >= 0 && (_y) < (pos).height ? (pos).topline + ((_y)+1)*(pos).step : 0, \
    969  (pos).x = (_x) >= 0 && (_x) < (pos).width ? (_x) : 0, (pos).currline + (_x) * (cs) )
    970 
    971 /* Get current coordinates                    */
    972 /*  pos    - position structure               */
    973 /*  x, y   - coordinates of the new position  */
    974 /*  cs     - number of the image channels     */
    975 #define CV_GET_CURRENT( pos, cs )  ((pos).currline + (pos).x * (cs))
    976 
    977 /* Move by one pixel relatively to current position */
    978 /*  pos    - position structure                     */
    979 /*  cs     - number of the image channels           */
    980 
    981 /* left */
    982 #define CV_MOVE_LEFT( pos, cs ) \
    983  ( --(pos).x >= 0 ? (pos).currline + (pos).x*(cs) : 0 )
    984 
    985 /* right */
    986 #define CV_MOVE_RIGHT( pos, cs ) \
    987  ( ++(pos).x < (pos).width ? (pos).currline + (pos).x*(cs) : 0 )
    988 
    989 /* up */
    990 #define CV_MOVE_UP( pos, cs ) \
    991  (((pos).currline -= (pos).step) != (pos).topline ? (pos).currline + (pos).x*(cs) : 0 )
    992 
    993 /* down */
    994 #define CV_MOVE_DOWN( pos, cs ) \
    995  (((pos).currline += (pos).step) != (pos).bottomline ? (pos).currline + (pos).x*(cs) : 0 )
    996 
    997 /* left up */
    998 #define CV_MOVE_LU( pos, cs ) ( CV_MOVE_LEFT(pos, cs), CV_MOVE_UP(pos, cs))
    999 
   1000 /* right up */
   1001 #define CV_MOVE_RU( pos, cs ) ( CV_MOVE_RIGHT(pos, cs), CV_MOVE_UP(pos, cs))
   1002 
   1003 /* left down */
   1004 #define CV_MOVE_LD( pos, cs ) ( CV_MOVE_LEFT(pos, cs), CV_MOVE_DOWN(pos, cs))
   1005 
   1006 /* right down */
   1007 #define CV_MOVE_RD( pos, cs ) ( CV_MOVE_RIGHT(pos, cs), CV_MOVE_DOWN(pos, cs))
   1008 
   1009 
   1010 
   1011 /* Move by one pixel relatively to current position with wrapping when the position     */
   1012 /* achieves image boundary                                                              */
   1013 /*  pos    - position structure                                                         */
   1014 /*  cs     - number of the image channels                                               */
   1015 
   1016 /* left */
   1017 #define CV_MOVE_LEFT_WRAP( pos, cs ) \
   1018  ((pos).currline + ( --(pos).x >= 0 ? (pos).x : ((pos).x = (pos).width-1))*(cs))
   1019 
   1020 /* right */
   1021 #define CV_MOVE_RIGHT_WRAP( pos, cs ) \
   1022  ((pos).currline + ( ++(pos).x < (pos).width ? (pos).x : ((pos).x = 0))*(cs) )
   1023 
   1024 /* up */
   1025 #define CV_MOVE_UP_WRAP( pos, cs ) \
   1026     ((((pos).currline -= (pos).step) != (pos).topline ? \
   1027     (pos).currline : ((pos).currline = (pos).bottomline - (pos).step)) + (pos).x*(cs) )
   1028 
   1029 /* down */
   1030 #define CV_MOVE_DOWN_WRAP( pos, cs ) \
   1031     ((((pos).currline += (pos).step) != (pos).bottomline ? \
   1032     (pos).currline : ((pos).currline = (pos).topline + (pos).step)) + (pos).x*(cs) )
   1033 
   1034 /* left up */
   1035 #define CV_MOVE_LU_WRAP( pos, cs ) ( CV_MOVE_LEFT_WRAP(pos, cs), CV_MOVE_UP_WRAP(pos, cs))
   1036 /* right up */
   1037 #define CV_MOVE_RU_WRAP( pos, cs ) ( CV_MOVE_RIGHT_WRAP(pos, cs), CV_MOVE_UP_WRAP(pos, cs))
   1038 /* left down */
   1039 #define CV_MOVE_LD_WRAP( pos, cs ) ( CV_MOVE_LEFT_WRAP(pos, cs), CV_MOVE_DOWN_WRAP(pos, cs))
   1040 /* right down */
   1041 #define CV_MOVE_RD_WRAP( pos, cs ) ( CV_MOVE_RIGHT_WRAP(pos, cs), CV_MOVE_DOWN_WRAP(pos, cs))
   1042 
   1043 /* Numeric constants which used for moving in arbitrary direction  */
   1044 #define CV_SHIFT_NONE   2
   1045 #define CV_SHIFT_LEFT   1
   1046 #define CV_SHIFT_RIGHT  3
   1047 #define CV_SHIFT_UP     6
   1048 #define CV_SHIFT_DOWN  10
   1049 #define CV_SHIFT_LU     5
   1050 #define CV_SHIFT_RU     7
   1051 #define CV_SHIFT_LD     9
   1052 #define CV_SHIFT_RD    11
   1053 
   1054 /* Move by one pixel in specified direction                                     */
   1055 /*  pos    - position structure                                                 */
   1056 /*  shift  - direction ( it's value must be one of the CV_SHIFT_ constants ) */
   1057 /*  cs     - number of the image channels                                       */
   1058 #define CV_MOVE_PARAM( pos, shift, cs )                                             \
   1059     ( (pos).currline += (pos).step_arr[(shift)>>2], (pos).x += ((shift)&3)-2,       \
   1060     ((pos).currline != (pos).topline && (pos).currline != (pos).bottomline &&       \
   1061     (pos).x >= 0 && (pos).x < (pos).width) ? (pos).currline + (pos).x*(cs) : 0 )
   1062 
   1063 /* Move by one pixel in specified direction with wrapping when the               */
   1064 /* position achieves image boundary                                              */
   1065 /*  pos    - position structure                                                  */
   1066 /*  shift  - direction ( it's value must be one of the CV_SHIFT_ constants )  */
   1067 /*  cs     - number of the image channels                                        */
   1068 #define CV_MOVE_PARAM_WRAP( pos, shift, cs )                                        \
   1069     ( (pos).currline += (pos).step_arr[(shift)>>2],                                 \
   1070     (pos).currline = ((pos).currline == (pos).topline ?                             \
   1071     (pos).bottomline - (pos).step :                                                 \
   1072     (pos).currline == (pos).bottomline ?                                            \
   1073     (pos).topline + (pos).step : (pos).currline),                                   \
   1074                                                                                     \
   1075     (pos).x += ((shift)&3)-2,                                                       \
   1076     (pos).x = ((pos).x < 0 ? (pos).width-1 : (pos).x >= (pos).width ? 0 : (pos).x), \
   1077                                                                                     \
   1078     (pos).currline + (pos).x*(cs) )
   1079 
   1080 #endif/*_CVCOMPAT_H_*/
   1081