Home | History | Annotate | Download | only in src
      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 #include "_cv.h"
     43 
     44 #define  ICV_DEF_ACC_FUNC( name, srctype, dsttype, cvtmacro )           \
     45 IPCVAPI_IMPL( CvStatus,                                                 \
     46 name,( const srctype *src, int srcstep, dsttype *dst,                   \
     47        int dststep, CvSize size ), (src, srcstep, dst, dststep, size )) \
     48                                                                         \
     49 {                                                                       \
     50     srcstep /= sizeof(src[0]);                                          \
     51     dststep /= sizeof(dst[0]);                                          \
     52                                                                         \
     53     for( ; size.height--; src += srcstep, dst += dststep )              \
     54     {                                                                   \
     55         int x;                                                          \
     56         for( x = 0; x <= size.width - 4; x += 4 )                       \
     57         {                                                               \
     58             dsttype t0 = dst[x] + cvtmacro(src[x]);                     \
     59             dsttype t1 = dst[x + 1] + cvtmacro(src[x + 1]);             \
     60             dst[x] = t0;  dst[x + 1] = t1;                              \
     61                                                                         \
     62             t0 = dst[x + 2] + cvtmacro(src[x + 2]);                     \
     63             t1 = dst[x + 3] + cvtmacro(src[x + 3]);                     \
     64             dst[x + 2] = t0;  dst[x + 3] = t1;                          \
     65         }                                                               \
     66                                                                         \
     67         for( ; x < size.width; x++ )                                    \
     68             dst[x] += cvtmacro(src[x]);                                 \
     69     }                                                                   \
     70                                                                         \
     71     return CV_OK;                                                       \
     72 }
     73 
     74 
     75 ICV_DEF_ACC_FUNC( icvAdd_8u32f_C1IR, uchar, float, CV_8TO32F )
     76 ICV_DEF_ACC_FUNC( icvAdd_32f_C1IR, float, float, CV_NOP )
     77 ICV_DEF_ACC_FUNC( icvAddSquare_8u32f_C1IR, uchar, float, CV_8TO32F_SQR )
     78 ICV_DEF_ACC_FUNC( icvAddSquare_32f_C1IR, float, float, CV_SQR )
     79 
     80 
     81 #define  ICV_DEF_ACCPROD_FUNC( flavor, srctype, dsttype, cvtmacro )         \
     82 IPCVAPI_IMPL( CvStatus, icvAddProduct_##flavor##_C1IR,                      \
     83 ( const srctype *src1, int step1, const srctype *src2, int step2,           \
     84   dsttype *dst, int dststep, CvSize size ),                                 \
     85  (src1, step1, src2, step2, dst, dststep, size) )                           \
     86 {                                                                           \
     87     step1 /= sizeof(src1[0]);                                               \
     88     step2 /= sizeof(src2[0]);                                               \
     89     dststep /= sizeof(dst[0]);                                              \
     90                                                                             \
     91     for( ; size.height--; src1 += step1, src2 += step2, dst += dststep )    \
     92     {                                                                       \
     93         int x;                                                              \
     94         for( x = 0; x <= size.width - 4; x += 4 )                           \
     95         {                                                                   \
     96             dsttype t0 = dst[x] + cvtmacro(src1[x])*cvtmacro(src2[x]);      \
     97             dsttype t1 = dst[x+1] + cvtmacro(src1[x+1])*cvtmacro(src2[x+1]);\
     98             dst[x] = t0;  dst[x + 1] = t1;                                  \
     99                                                                             \
    100             t0 = dst[x + 2] + cvtmacro(src1[x + 2])*cvtmacro(src2[x + 2]);  \
    101             t1 = dst[x + 3] + cvtmacro(src1[x + 3])*cvtmacro(src2[x + 3]);  \
    102             dst[x + 2] = t0;  dst[x + 3] = t1;                              \
    103         }                                                                   \
    104                                                                             \
    105         for( ; x < size.width; x++ )                                        \
    106             dst[x] += cvtmacro(src1[x])*cvtmacro(src2[x]);                  \
    107     }                                                                       \
    108                                                                             \
    109     return CV_OK;                                                           \
    110 }
    111 
    112 
    113 ICV_DEF_ACCPROD_FUNC( 8u32f, uchar, float, CV_8TO32F )
    114 ICV_DEF_ACCPROD_FUNC( 32f, float, float, CV_NOP )
    115 
    116 
    117 #define  ICV_DEF_ACCWEIGHT_FUNC( flavor, srctype, dsttype, cvtmacro )   \
    118 IPCVAPI_IMPL( CvStatus, icvAddWeighted_##flavor##_C1IR,                 \
    119 ( const srctype *src, int srcstep, dsttype *dst, int dststep,           \
    120   CvSize size, dsttype alpha ), (src, srcstep, dst, dststep, size, alpha) )\
    121 {                                                                       \
    122     dsttype beta = (dsttype)(1 - alpha);                                \
    123     srcstep /= sizeof(src[0]);                                          \
    124     dststep /= sizeof(dst[0]);                                          \
    125                                                                         \
    126     for( ; size.height--; src += srcstep, dst += dststep )              \
    127     {                                                                   \
    128         int x;                                                          \
    129         for( x = 0; x <= size.width - 4; x += 4 )                       \
    130         {                                                               \
    131             dsttype t0 = dst[x]*beta + cvtmacro(src[x])*alpha;          \
    132             dsttype t1 = dst[x+1]*beta + cvtmacro(src[x+1])*alpha;      \
    133             dst[x] = t0; dst[x + 1] = t1;                               \
    134                                                                         \
    135             t0 = dst[x + 2]*beta + cvtmacro(src[x + 2])*alpha;          \
    136             t1 = dst[x + 3]*beta + cvtmacro(src[x + 3])*alpha;          \
    137             dst[x + 2] = t0; dst[x + 3] = t1;                           \
    138         }                                                               \
    139                                                                         \
    140         for( ; x < size.width; x++ )                                    \
    141             dst[x] = dst[x]*beta + cvtmacro(src[x])*alpha;              \
    142     }                                                                   \
    143                                                                         \
    144     return CV_OK;                                                       \
    145 }
    146 
    147 
    148 ICV_DEF_ACCWEIGHT_FUNC( 8u32f, uchar, float, CV_8TO32F )
    149 ICV_DEF_ACCWEIGHT_FUNC( 32f, float, float, CV_NOP )
    150 
    151 
    152 #define  ICV_DEF_ACCMASK_FUNC_C1( name, srctype, dsttype, cvtmacro )    \
    153 IPCVAPI_IMPL( CvStatus,                                                 \
    154 name,( const srctype *src, int srcstep, const uchar* mask, int maskstep,\
    155        dsttype *dst, int dststep, CvSize size ),                        \
    156        (src, srcstep, mask, maskstep, dst, dststep, size ))             \
    157 {                                                                       \
    158     srcstep /= sizeof(src[0]);                                          \
    159     dststep /= sizeof(dst[0]);                                          \
    160                                                                         \
    161     for( ; size.height--; src += srcstep,                               \
    162                           dst += dststep, mask += maskstep )            \
    163     {                                                                   \
    164         int x;                                                          \
    165         for( x = 0; x <= size.width - 2; x += 2 )                       \
    166         {                                                               \
    167             if( mask[x] )                                               \
    168                 dst[x] += cvtmacro(src[x]);                             \
    169             if( mask[x+1] )                                             \
    170                 dst[x+1] += cvtmacro(src[x+1]);                         \
    171         }                                                               \
    172                                                                         \
    173         for( ; x < size.width; x++ )                                    \
    174             if( mask[x] )                                               \
    175                 dst[x] += cvtmacro(src[x]);                             \
    176     }                                                                   \
    177                                                                         \
    178     return CV_OK;                                                       \
    179 }
    180 
    181 
    182 ICV_DEF_ACCMASK_FUNC_C1( icvAdd_8u32f_C1IMR, uchar, float, CV_8TO32F )
    183 ICV_DEF_ACCMASK_FUNC_C1( icvAdd_32f_C1IMR, float, float, CV_NOP )
    184 ICV_DEF_ACCMASK_FUNC_C1( icvAddSquare_8u32f_C1IMR, uchar, float, CV_8TO32F_SQR )
    185 ICV_DEF_ACCMASK_FUNC_C1( icvAddSquare_32f_C1IMR, float, float, CV_SQR )
    186 
    187 
    188 #define  ICV_DEF_ACCPRODUCTMASK_FUNC_C1( flavor, srctype, dsttype, cvtmacro )  \
    189 IPCVAPI_IMPL( CvStatus, icvAddProduct_##flavor##_C1IMR,                 \
    190 ( const srctype *src1, int step1, const srctype* src2, int step2,       \
    191   const uchar* mask, int maskstep, dsttype *dst, int dststep, CvSize size ),\
    192   (src1, step1, src2, step2, mask, maskstep, dst, dststep, size ))      \
    193 {                                                                       \
    194     step1 /= sizeof(src1[0]);                                           \
    195     step2 /= sizeof(src2[0]);                                           \
    196     dststep /= sizeof(dst[0]);                                          \
    197                                                                         \
    198     for( ; size.height--; src1 += step1, src2 += step2,                 \
    199                           dst += dststep, mask += maskstep )            \
    200     {                                                                   \
    201         int x;                                                          \
    202         for( x = 0; x <= size.width - 2; x += 2 )                       \
    203         {                                                               \
    204             if( mask[x] )                                               \
    205                 dst[x] += cvtmacro(src1[x])*cvtmacro(src2[x]);          \
    206             if( mask[x+1] )                                             \
    207                 dst[x+1] += cvtmacro(src1[x+1])*cvtmacro(src2[x+1]);    \
    208         }                                                               \
    209                                                                         \
    210         for( ; x < size.width; x++ )                                    \
    211             if( mask[x] )                                               \
    212                 dst[x] += cvtmacro(src1[x])*cvtmacro(src2[x]);          \
    213     }                                                                   \
    214                                                                         \
    215     return CV_OK;                                                       \
    216 }
    217 
    218 
    219 ICV_DEF_ACCPRODUCTMASK_FUNC_C1( 8u32f, uchar, float, CV_8TO32F )
    220 ICV_DEF_ACCPRODUCTMASK_FUNC_C1( 32f, float, float, CV_NOP )
    221 
    222 #define  ICV_DEF_ACCWEIGHTMASK_FUNC_C1( flavor, srctype, dsttype, cvtmacro ) \
    223 IPCVAPI_IMPL( CvStatus, icvAddWeighted_##flavor##_C1IMR,                \
    224 ( const srctype *src, int srcstep, const uchar* mask, int maskstep,     \
    225   dsttype *dst, int dststep, CvSize size, dsttype alpha ),              \
    226   (src, srcstep, mask, maskstep, dst, dststep, size, alpha ))           \
    227 {                                                                       \
    228     dsttype beta = (dsttype)(1 - alpha);                                \
    229     srcstep /= sizeof(src[0]);                                          \
    230     dststep /= sizeof(dst[0]);                                          \
    231                                                                         \
    232     for( ; size.height--; src += srcstep,                               \
    233                           dst += dststep, mask += maskstep )            \
    234     {                                                                   \
    235         int x;                                                          \
    236         for( x = 0; x <= size.width - 2; x += 2 )                       \
    237         {                                                               \
    238             if( mask[x] )                                               \
    239                 dst[x] = dst[x]*beta + cvtmacro(src[x])*alpha;          \
    240             if( mask[x+1] )                                             \
    241                 dst[x+1] = dst[x+1]*beta + cvtmacro(src[x+1])*alpha;    \
    242         }                                                               \
    243                                                                         \
    244         for( ; x < size.width; x++ )                                    \
    245             if( mask[x] )                                               \
    246                 dst[x] = dst[x]*beta + cvtmacro(src[x])*alpha;          \
    247     }                                                                   \
    248                                                                         \
    249     return CV_OK;                                                       \
    250 }
    251 
    252 ICV_DEF_ACCWEIGHTMASK_FUNC_C1( 8u32f, uchar, float, CV_8TO32F )
    253 ICV_DEF_ACCWEIGHTMASK_FUNC_C1( 32f, float, float, CV_NOP )
    254 
    255 
    256 #define  ICV_DEF_ACCMASK_FUNC_C3( name, srctype, dsttype, cvtmacro )    \
    257 IPCVAPI_IMPL( CvStatus,                                                 \
    258 name,( const srctype *src, int srcstep, const uchar* mask, int maskstep,\
    259        dsttype *dst, int dststep, CvSize size ),                        \
    260        (src, srcstep, mask, maskstep, dst, dststep, size ))             \
    261 {                                                                       \
    262     srcstep /= sizeof(src[0]);                                          \
    263     dststep /= sizeof(dst[0]);                                          \
    264                                                                         \
    265     for( ; size.height--; src += srcstep,                               \
    266                           dst += dststep, mask += maskstep )            \
    267     {                                                                   \
    268         int x;                                                          \
    269         for( x = 0; x < size.width; x++ )                               \
    270             if( mask[x] )                                               \
    271             {                                                           \
    272                 dsttype t0, t1, t2;                                     \
    273                 t0 = dst[x*3] + cvtmacro(src[x*3]);                     \
    274                 t1 = dst[x*3+1] + cvtmacro(src[x*3+1]);                 \
    275                 t2 = dst[x*3+2] + cvtmacro(src[x*3+2]);                 \
    276                 dst[x*3] = t0;                                          \
    277                 dst[x*3+1] = t1;                                        \
    278                 dst[x*3+2] = t2;                                        \
    279             }                                                           \
    280     }                                                                   \
    281                                                                         \
    282     return CV_OK;                                                       \
    283 }
    284 
    285 
    286 ICV_DEF_ACCMASK_FUNC_C3( icvAdd_8u32f_C3IMR, uchar, float, CV_8TO32F )
    287 ICV_DEF_ACCMASK_FUNC_C3( icvAdd_32f_C3IMR, float, float, CV_NOP )
    288 ICV_DEF_ACCMASK_FUNC_C3( icvAddSquare_8u32f_C3IMR, uchar, float, CV_8TO32F_SQR )
    289 ICV_DEF_ACCMASK_FUNC_C3( icvAddSquare_32f_C3IMR, float, float, CV_SQR )
    290 
    291 
    292 #define  ICV_DEF_ACCPRODUCTMASK_FUNC_C3( flavor, srctype, dsttype, cvtmacro )  \
    293 IPCVAPI_IMPL( CvStatus, icvAddProduct_##flavor##_C3IMR,                 \
    294 ( const srctype *src1, int step1, const srctype* src2, int step2,       \
    295   const uchar* mask, int maskstep, dsttype *dst, int dststep, CvSize size ),\
    296   (src1, step1, src2, step2, mask, maskstep, dst, dststep, size ))      \
    297 {                                                                       \
    298     step1 /= sizeof(src1[0]);                                           \
    299     step2 /= sizeof(src2[0]);                                           \
    300     dststep /= sizeof(dst[0]);                                          \
    301                                                                         \
    302     for( ; size.height--; src1 += step1, src2 += step2,                 \
    303                           dst += dststep, mask += maskstep )            \
    304     {                                                                   \
    305         int x;                                                          \
    306         for( x = 0; x < size.width; x++ )                               \
    307             if( mask[x] )                                               \
    308             {                                                           \
    309                 dsttype t0, t1, t2;                                     \
    310                 t0 = dst[x*3]+cvtmacro(src1[x*3])*cvtmacro(src2[x*3]);  \
    311                 t1 = dst[x*3+1]+cvtmacro(src1[x*3+1])*cvtmacro(src2[x*3+1]);\
    312                 t2 = dst[x*3+2]+cvtmacro(src1[x*3+2])*cvtmacro(src2[x*3+2]);\
    313                 dst[x*3] = t0;                                          \
    314                 dst[x*3+1] = t1;                                        \
    315                 dst[x*3+2] = t2;                                        \
    316             }                                                           \
    317     }                                                                   \
    318                                                                         \
    319     return CV_OK;                                                       \
    320 }
    321 
    322 
    323 ICV_DEF_ACCPRODUCTMASK_FUNC_C3( 8u32f, uchar, float, CV_8TO32F )
    324 ICV_DEF_ACCPRODUCTMASK_FUNC_C3( 32f, float, float, CV_NOP )
    325 
    326 
    327 #define  ICV_DEF_ACCWEIGHTMASK_FUNC_C3( flavor, srctype, dsttype, cvtmacro ) \
    328 IPCVAPI_IMPL( CvStatus, icvAddWeighted_##flavor##_C3IMR,                \
    329 ( const srctype *src, int srcstep, const uchar* mask, int maskstep,     \
    330   dsttype *dst, int dststep, CvSize size, dsttype alpha ),              \
    331   (src, srcstep, mask, maskstep, dst, dststep, size, alpha ))           \
    332 {                                                                       \
    333     dsttype beta = (dsttype)(1 - alpha);                                \
    334     srcstep /= sizeof(src[0]);                                          \
    335     dststep /= sizeof(dst[0]);                                          \
    336                                                                         \
    337     for( ; size.height--; src += srcstep,                               \
    338                           dst += dststep, mask += maskstep )            \
    339     {                                                                   \
    340         int x;                                                          \
    341         for( x = 0; x < size.width; x++ )                               \
    342             if( mask[x] )                                               \
    343             {                                                           \
    344                 dsttype t0, t1, t2;                                     \
    345                 t0 = dst[x*3]*beta + cvtmacro(src[x*3])*alpha;          \
    346                 t1 = dst[x*3+1]*beta + cvtmacro(src[x*3+1])*alpha;      \
    347                 t2 = dst[x*3+2]*beta + cvtmacro(src[x*3+2])*alpha;      \
    348                 dst[x*3] = t0;                                          \
    349                 dst[x*3+1] = t1;                                        \
    350                 dst[x*3+2] = t2;                                        \
    351             }                                                           \
    352     }                                                                   \
    353                                                                         \
    354     return CV_OK;                                                       \
    355 }
    356 
    357 ICV_DEF_ACCWEIGHTMASK_FUNC_C3( 8u32f, uchar, float, CV_8TO32F )
    358 ICV_DEF_ACCWEIGHTMASK_FUNC_C3( 32f, float, float, CV_NOP )
    359 
    360 
    361 #define  ICV_DEF_INIT_ACC_TAB( FUNCNAME )                                           \
    362 static  void  icvInit##FUNCNAME##Table( CvFuncTable* tab, CvBigFuncTable* masktab ) \
    363 {                                                                                   \
    364     tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u32f_C1IR;                          \
    365     tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_C1IR;                           \
    366                                                                                     \
    367     masktab->fn_2d[CV_8UC1] = (void*)icv##FUNCNAME##_8u32f_C1IMR;                   \
    368     masktab->fn_2d[CV_32FC1] = (void*)icv##FUNCNAME##_32f_C1IMR;                    \
    369                                                                                     \
    370     masktab->fn_2d[CV_8UC3] = (void*)icv##FUNCNAME##_8u32f_C3IMR;                   \
    371     masktab->fn_2d[CV_32FC3] = (void*)icv##FUNCNAME##_32f_C3IMR;                    \
    372 }
    373 
    374 
    375 ICV_DEF_INIT_ACC_TAB( Add )
    376 ICV_DEF_INIT_ACC_TAB( AddSquare )
    377 ICV_DEF_INIT_ACC_TAB( AddProduct )
    378 ICV_DEF_INIT_ACC_TAB( AddWeighted )
    379 
    380 
    381 CV_IMPL void
    382 cvAcc( const void* arr, void* sumarr, const void* maskarr )
    383 {
    384     static CvFuncTable acc_tab;
    385     static CvBigFuncTable accmask_tab;
    386     static int inittab = 0;
    387 
    388     CV_FUNCNAME( "cvAcc" );
    389 
    390     __BEGIN__;
    391 
    392     int type, sumdepth;
    393     int mat_step, sum_step, mask_step = 0;
    394     CvSize size;
    395     CvMat stub, *mat = (CvMat*)arr;
    396     CvMat sumstub, *sum = (CvMat*)sumarr;
    397     CvMat maskstub, *mask = (CvMat*)maskarr;
    398 
    399     if( !inittab )
    400     {
    401         icvInitAddTable( &acc_tab, &accmask_tab );
    402         inittab = 1;
    403     }
    404 
    405     if( !CV_IS_MAT( mat ) || !CV_IS_MAT( sum ))
    406     {
    407         int coi1 = 0, coi2 = 0;
    408         CV_CALL( mat = cvGetMat( mat, &stub, &coi1 ));
    409         CV_CALL( sum = cvGetMat( sum, &sumstub, &coi2 ));
    410         if( coi1 + coi2 != 0 )
    411             CV_ERROR( CV_BadCOI, "" );
    412     }
    413 
    414     if( CV_MAT_DEPTH( sum->type ) != CV_32F )
    415         CV_ERROR( CV_BadDepth, "" );
    416 
    417     if( !CV_ARE_CNS_EQ( mat, sum ))
    418         CV_ERROR( CV_StsUnmatchedFormats, "" );
    419 
    420     sumdepth = CV_MAT_DEPTH( sum->type );
    421     if( sumdepth != CV_32F && (maskarr != 0 || sumdepth != CV_64F))
    422         CV_ERROR( CV_BadDepth, "Bad accumulator type" );
    423 
    424     if( !CV_ARE_SIZES_EQ( mat, sum ))
    425         CV_ERROR( CV_StsUnmatchedSizes, "" );
    426 
    427     size = cvGetMatSize( mat );
    428     type = CV_MAT_TYPE( mat->type );
    429 
    430     mat_step = mat->step;
    431     sum_step = sum->step;
    432 
    433     if( !mask )
    434     {
    435         CvFunc2D_2A func=(CvFunc2D_2A)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
    436 
    437         if( !func )
    438             CV_ERROR( CV_StsUnsupportedFormat, "Unsupported type combination" );
    439 
    440         size.width *= CV_MAT_CN(type);
    441         if( CV_IS_MAT_CONT( mat->type & sum->type ))
    442         {
    443             size.width *= size.height;
    444             mat_step = sum_step = CV_STUB_STEP;
    445             size.height = 1;
    446         }
    447 
    448         IPPI_CALL( func( mat->data.ptr, mat_step, sum->data.ptr, sum_step, size ));
    449     }
    450     else
    451     {
    452         CvFunc2D_3A func = (CvFunc2D_3A)accmask_tab.fn_2d[type];
    453 
    454         if( !func )
    455             CV_ERROR( CV_StsUnsupportedFormat, "" );
    456 
    457         CV_CALL( mask = cvGetMat( mask, &maskstub ));
    458 
    459         if( !CV_IS_MASK_ARR( mask ))
    460             CV_ERROR( CV_StsBadMask, "" );
    461 
    462         if( !CV_ARE_SIZES_EQ( mat, mask ))
    463             CV_ERROR( CV_StsUnmatchedSizes, "" );
    464 
    465         mask_step = mask->step;
    466 
    467         if( CV_IS_MAT_CONT( mat->type & sum->type & mask->type ))
    468         {
    469             size.width *= size.height;
    470             mat_step = sum_step = mask_step = CV_STUB_STEP;
    471             size.height = 1;
    472         }
    473 
    474         IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr, mask_step,
    475                          sum->data.ptr, sum_step, size ));
    476     }
    477 
    478     __END__;
    479 }
    480 
    481 
    482 CV_IMPL void
    483 cvSquareAcc( const void* arr, void* sq_sum, const void* maskarr )
    484 {
    485     static CvFuncTable acc_tab;
    486     static CvBigFuncTable accmask_tab;
    487     static int inittab = 0;
    488 
    489     CV_FUNCNAME( "cvSquareAcc" );
    490 
    491     __BEGIN__;
    492 
    493     int coi1, coi2;
    494     int type;
    495     int mat_step, sum_step, mask_step = 0;
    496     CvSize size;
    497     CvMat stub, *mat = (CvMat*)arr;
    498     CvMat sumstub, *sum = (CvMat*)sq_sum;
    499     CvMat maskstub, *mask = (CvMat*)maskarr;
    500 
    501     if( !inittab )
    502     {
    503         icvInitAddSquareTable( &acc_tab, &accmask_tab );
    504         inittab = 1;
    505     }
    506 
    507     CV_CALL( mat = cvGetMat( mat, &stub, &coi1 ));
    508     CV_CALL( sum = cvGetMat( sum, &sumstub, &coi2 ));
    509 
    510     if( coi1 != 0 || coi2 != 0 )
    511         CV_ERROR( CV_BadCOI, "" );
    512 
    513     if( !CV_ARE_CNS_EQ( mat, sum ))
    514         CV_ERROR( CV_StsUnmatchedFormats, "" );
    515 
    516     if( CV_MAT_DEPTH( sum->type ) != CV_32F )
    517         CV_ERROR( CV_BadDepth, "" );
    518 
    519     if( !CV_ARE_SIZES_EQ( mat, sum ))
    520         CV_ERROR( CV_StsUnmatchedSizes, "" );
    521 
    522     size = cvGetMatSize( mat );
    523     type = CV_MAT_TYPE( mat->type );
    524 
    525     mat_step = mat->step;
    526     sum_step = sum->step;
    527 
    528     if( !mask )
    529     {
    530         CvFunc2D_2A func = (CvFunc2D_2A)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
    531 
    532         if( !func )
    533             CV_ERROR( CV_StsUnsupportedFormat, "" );
    534 
    535         size.width *= CV_MAT_CN(type);
    536 
    537         if( CV_IS_MAT_CONT( mat->type & sum->type ))
    538         {
    539             size.width *= size.height;
    540             mat_step = sum_step = CV_STUB_STEP;;
    541             size.height = 1;
    542         }
    543 
    544         IPPI_CALL( func( mat->data.ptr, mat_step, sum->data.ptr, sum_step, size ));
    545     }
    546     else
    547     {
    548         CvFunc2D_3A func = (CvFunc2D_3A)accmask_tab.fn_2d[type];
    549 
    550         if( !func )
    551             CV_ERROR( CV_StsUnsupportedFormat, "" );
    552 
    553         CV_CALL( mask = cvGetMat( mask, &maskstub ));
    554 
    555         if( !CV_IS_MASK_ARR( mask ))
    556             CV_ERROR( CV_StsBadMask, "" );
    557 
    558         if( !CV_ARE_SIZES_EQ( mat, mask ))
    559             CV_ERROR( CV_StsUnmatchedSizes, "" );
    560 
    561         mask_step = mask->step;
    562 
    563         if( CV_IS_MAT_CONT( mat->type & sum->type & mask->type ))
    564         {
    565             size.width *= size.height;
    566             mat_step = sum_step = mask_step = CV_STUB_STEP;
    567             size.height = 1;
    568         }
    569 
    570         IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr, mask_step,
    571                          sum->data.ptr, sum_step, size ));
    572     }
    573 
    574     __END__;
    575 }
    576 
    577 
    578 CV_IMPL void
    579 cvMultiplyAcc( const void* arrA, const void* arrB,
    580                void* acc, const void* maskarr )
    581 {
    582     static CvFuncTable acc_tab;
    583     static CvBigFuncTable accmask_tab;
    584     static int inittab = 0;
    585 
    586     CV_FUNCNAME( "cvMultiplyAcc" );
    587 
    588     __BEGIN__;
    589 
    590     int coi1, coi2, coi3;
    591     int type;
    592     int mat1_step, mat2_step, sum_step, mask_step = 0;
    593     CvSize size;
    594     CvMat stub1, *mat1 = (CvMat*)arrA;
    595     CvMat stub2, *mat2 = (CvMat*)arrB;
    596     CvMat sumstub, *sum = (CvMat*)acc;
    597     CvMat maskstub, *mask = (CvMat*)maskarr;
    598 
    599     if( !inittab )
    600     {
    601         icvInitAddProductTable( &acc_tab, &accmask_tab );
    602         inittab = 1;
    603     }
    604 
    605     CV_CALL( mat1 = cvGetMat( mat1, &stub1, &coi1 ));
    606     CV_CALL( mat2 = cvGetMat( mat2, &stub2, &coi2 ));
    607     CV_CALL( sum = cvGetMat( sum, &sumstub, &coi3 ));
    608 
    609     if( coi1 != 0 || coi2 != 0 || coi3 != 0 )
    610         CV_ERROR( CV_BadCOI, "" );
    611 
    612     if( !CV_ARE_CNS_EQ( mat1, mat2 ) || !CV_ARE_CNS_EQ( mat1, sum ))
    613         CV_ERROR( CV_StsUnmatchedFormats, "" );
    614 
    615     if( CV_MAT_DEPTH( sum->type ) != CV_32F )
    616         CV_ERROR( CV_BadDepth, "" );
    617 
    618     if( !CV_ARE_SIZES_EQ( mat1, sum ) || !CV_ARE_SIZES_EQ( mat2, sum ))
    619         CV_ERROR( CV_StsUnmatchedSizes, "" );
    620 
    621     size = cvGetMatSize( mat1 );
    622     type = CV_MAT_TYPE( mat1->type );
    623 
    624     mat1_step = mat1->step;
    625     mat2_step = mat2->step;
    626     sum_step = sum->step;
    627 
    628     if( !mask )
    629     {
    630         CvFunc2D_3A func = (CvFunc2D_3A)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
    631 
    632         if( !func )
    633             CV_ERROR( CV_StsUnsupportedFormat, "" );
    634 
    635         size.width *= CV_MAT_CN(type);
    636 
    637         if( CV_IS_MAT_CONT( mat1->type & mat2->type & sum->type ))
    638         {
    639             size.width *= size.height;
    640             mat1_step = mat2_step = sum_step = CV_STUB_STEP;
    641             size.height = 1;
    642         }
    643 
    644         IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
    645                          sum->data.ptr, sum_step, size ));
    646     }
    647     else
    648     {
    649         CvFunc2D_4A func = (CvFunc2D_4A)accmask_tab.fn_2d[type];
    650 
    651         if( !func )
    652             CV_ERROR( CV_StsUnsupportedFormat, "" );
    653 
    654         CV_CALL( mask = cvGetMat( mask, &maskstub ));
    655 
    656         if( !CV_IS_MASK_ARR( mask ))
    657             CV_ERROR( CV_StsBadMask, "" );
    658 
    659         if( !CV_ARE_SIZES_EQ( mat1, mask ))
    660             CV_ERROR( CV_StsUnmatchedSizes, "" );
    661 
    662         mask_step = mask->step;
    663 
    664         if( CV_IS_MAT_CONT( mat1->type & mat2->type & sum->type & mask->type ))
    665         {
    666             size.width *= size.height;
    667             mat1_step = mat2_step = sum_step = mask_step = CV_STUB_STEP;
    668             size.height = 1;
    669         }
    670 
    671         IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
    672                          mask->data.ptr, mask_step,
    673                          sum->data.ptr, sum_step, size ));
    674     }
    675 
    676     __END__;
    677 }
    678 
    679 
    680 typedef CvStatus (CV_STDCALL *CvAddWeightedFunc)( const void* src, int srcstep,
    681                                                   void* dst, int dststep,
    682                                                   CvSize size, float alpha );
    683 
    684 typedef CvStatus (CV_STDCALL *CvAddWeightedMaskFunc)( const void* src, int srcstep,
    685                                                       void* dst, int dststep,
    686                                                       const void* mask, int maskstep,
    687                                                       CvSize size, float alpha );
    688 
    689 CV_IMPL void
    690 cvRunningAvg( const void* arrY, void* arrU,
    691               double alpha, const void* maskarr )
    692 {
    693     static CvFuncTable acc_tab;
    694     static CvBigFuncTable accmask_tab;
    695     static int inittab = 0;
    696 
    697     CV_FUNCNAME( "cvRunningAvg" );
    698 
    699     __BEGIN__;
    700 
    701     int coi1, coi2;
    702     int type;
    703     int mat_step, sum_step, mask_step = 0;
    704     CvSize size;
    705     CvMat stub, *mat = (CvMat*)arrY;
    706     CvMat sumstub, *sum = (CvMat*)arrU;
    707     CvMat maskstub, *mask = (CvMat*)maskarr;
    708 
    709     if( !inittab )
    710     {
    711         icvInitAddWeightedTable( &acc_tab, &accmask_tab );
    712         inittab = 1;
    713     }
    714 
    715     CV_CALL( mat = cvGetMat( mat, &stub, &coi1 ));
    716     CV_CALL( sum = cvGetMat( sum, &sumstub, &coi2 ));
    717 
    718     if( coi1 != 0 || coi2 != 0 )
    719         CV_ERROR( CV_BadCOI, "" );
    720 
    721     if( !CV_ARE_CNS_EQ( mat, sum ))
    722         CV_ERROR( CV_StsUnmatchedFormats, "" );
    723 
    724     if( CV_MAT_DEPTH( sum->type ) != CV_32F )
    725         CV_ERROR( CV_BadDepth, "" );
    726 
    727     if( !CV_ARE_SIZES_EQ( mat, sum ))
    728         CV_ERROR( CV_StsUnmatchedSizes, "" );
    729 
    730     size = cvGetMatSize( mat );
    731     type = CV_MAT_TYPE( mat->type );
    732 
    733     mat_step = mat->step;
    734     sum_step = sum->step;
    735 
    736     if( !mask )
    737     {
    738         CvAddWeightedFunc func = (CvAddWeightedFunc)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
    739 
    740         if( !func )
    741             CV_ERROR( CV_StsUnsupportedFormat, "" );
    742 
    743         size.width *= CV_MAT_CN(type);
    744         if( CV_IS_MAT_CONT( mat->type & sum->type ))
    745         {
    746             size.width *= size.height;
    747             mat_step = sum_step = CV_STUB_STEP;
    748             size.height = 1;
    749         }
    750 
    751         IPPI_CALL( func( mat->data.ptr, mat_step,
    752                          sum->data.ptr, sum_step, size, (float)alpha ));
    753     }
    754     else
    755     {
    756         CvAddWeightedMaskFunc func = (CvAddWeightedMaskFunc)accmask_tab.fn_2d[type];
    757 
    758         if( !func )
    759             CV_ERROR( CV_StsUnsupportedFormat, "" );
    760 
    761         CV_CALL( mask = cvGetMat( mask, &maskstub ));
    762 
    763         if( !CV_IS_MASK_ARR( mask ))
    764             CV_ERROR( CV_StsBadMask, "" );
    765 
    766         if( !CV_ARE_SIZES_EQ( mat, mask ))
    767             CV_ERROR( CV_StsUnmatchedSizes, "" );
    768 
    769         mask_step = mask->step;
    770 
    771         if( CV_IS_MAT_CONT( mat->type & sum->type & mask->type ))
    772         {
    773             size.width *= size.height;
    774             mat_step = sum_step = mask_step = CV_STUB_STEP;
    775             size.height = 1;
    776         }
    777 
    778         IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr, mask_step,
    779                          sum->data.ptr, sum_step, size, (float)alpha ));
    780     }
    781 
    782     __END__;
    783 }
    784 
    785 
    786 /* End of file. */
    787