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 #include "_cvaux.h"
     42 #include <assert.h>
     43 
     44 
     45 static CvStatus
     46 icvMorphEpilines8uC3( uchar * first_pix,        /* raster epiline from image 1      */
     47                       uchar * second_pix,       /* raster epiline from image 2      */
     48                       uchar * dst_pix,  /* raster epiline from dest image   */
     49                       /* (it's an output parameter)       */
     50                       float alpha,      /* relative position of camera      */
     51                       int *first,       /* first sequence of runs           */
     52                       int first_runs,   /* it's length                      */
     53                       int *second,      /* second sequence of runs          */
     54                       int second_runs, int *first_corr, /* corr data for the 1st seq        */
     55                       int *second_corr, /* corr data for the 2nd seq        */
     56                       int dst_len )
     57 {
     58 
     59     float alpha1;               /* alpha - 1.0 */
     60     int s, s1;                  /* integer variant of alpha and alpha1 ( 0 <= s,s1 <= 256 ) */
     61     int curr;                   /* current index in run's array */
     62 
     63     float begLine;              /* begin of current run */
     64     float endLine;              /* end   of current run */
     65 
     66     float begCorr;              /* begin of correspondence destination of run */
     67     float endCorr;              /* end   of correspondence destination of run */
     68 
     69     int begDestLine;            /* begin of current destanation of run */
     70     int endDestLine;            /* end   of current destanation of run */
     71     int begLineIndex;
     72     int endLineIndex;
     73     int indexImg1;
     74     float step = 0;
     75     int n;
     76 
     77     memset( dst_pix, 0, dst_len );
     78     alpha1 = (float) (1.0 - alpha);
     79 
     80     s = (int) (alpha * 256);
     81     s1 = 256 - s;
     82 
     83     /* --------------Create first line------------- */
     84 
     85     begLineIndex = first[0];
     86     begLine = (float) begLineIndex;
     87 
     88     curr = 0;
     89 
     90     for( n = 0; n < first_runs; n++ )
     91     {                           /* for each run */
     92 
     93         begCorr = (float) first_corr[curr];
     94         curr++;
     95         endCorr = (float) first_corr[curr];
     96         curr++;
     97         endLineIndex = first[curr];
     98         endLine = (float) endLineIndex;
     99 
    100         begDestLine = (int) (alpha * begLine + alpha1 * begCorr);
    101         endDestLine = (int) (alpha * endLine + alpha1 * endCorr);
    102 
    103         indexImg1 = begDestLine * 3;
    104 
    105         step = 0;
    106         if( endDestLine != begDestLine )
    107             step = (endLine - begLine) / ((float) (endDestLine - begDestLine));
    108 
    109         if( begCorr != endCorr )
    110         {
    111 
    112             for( ; begDestLine < endDestLine; begDestLine++ )
    113             {
    114                 /* for each pixel */
    115 
    116                 begLineIndex = (int) begLine;
    117                 begLineIndex *= 3;
    118 
    119                 /* Blend R */
    120                 dst_pix[indexImg1] = (uchar) (((int) (first_pix[begLineIndex]) * s) >> 8);
    121 
    122                 indexImg1++;
    123 
    124                 /* Blend G */
    125                 dst_pix[indexImg1] = (uchar) (((int) (first_pix[begLineIndex + 1]) * s) >> 8);
    126 
    127                 indexImg1++;
    128 
    129                 /* Blend B */
    130                 dst_pix[indexImg1] = (uchar) (((int) (first_pix[begLineIndex + 2]) * s) >> 8);
    131 
    132                 indexImg1++;
    133 
    134                 begLine += step;
    135 
    136             }                   /* for */
    137         }
    138         else
    139         {
    140 
    141             for( ; begDestLine < endDestLine; begDestLine++ )
    142             {
    143                 /* for each pixel */
    144 
    145                 begLineIndex = (int) begLine;
    146                 begLineIndex *= 3;
    147 
    148                 /* Blend R */
    149                 dst_pix[indexImg1] = first_pix[begLineIndex];
    150                 indexImg1++;
    151 
    152                 /* Blend G */
    153                 dst_pix[indexImg1] = first_pix[begLineIndex + 1];
    154                 indexImg1++;
    155 
    156                 /* Blend B */
    157                 dst_pix[indexImg1] = first_pix[begLineIndex + 2];
    158 
    159                 indexImg1++;
    160 
    161                 begLine += step;
    162 
    163             }                   /* for */
    164         }                       /* if */
    165 
    166         begLineIndex = endLineIndex;
    167         begLine = endLine;
    168 
    169 
    170     }                           /* for each runs in first line */
    171 
    172     begLineIndex = second[0];
    173     begLine = (float) begLineIndex;
    174 
    175     curr = 0;
    176 
    177     /* --------------Create second line------------- */
    178     curr = 0;;
    179     for( n = 0; n < second_runs; n++ )
    180     {                           /* for each run */
    181 
    182         begCorr = (float) second_corr[curr];
    183         curr++;
    184         endCorr = (float) second_corr[curr];
    185         curr++;
    186         endLineIndex = second[curr];
    187         endLine = (float) endLineIndex;
    188 
    189         begDestLine = (int) (alpha1 * begLine + alpha * begCorr);
    190         endDestLine = (int) (alpha1 * endLine + alpha * endCorr);
    191 
    192         indexImg1 = begDestLine * 3;
    193 
    194         step = 0;
    195         if (endDestLine != begDestLine)
    196             step = (endLine - begLine) / ((float) (endDestLine - begDestLine));
    197 
    198         if( begCorr != endCorr )
    199         {
    200 
    201             for( ; begDestLine < endDestLine; begDestLine++ )
    202             {
    203                 /* for each pixel */
    204 
    205                 begLineIndex = (int) begLine;
    206                 begLineIndex *= 3;
    207 
    208                 /* Blend R */
    209                 dst_pix[indexImg1] =
    210                     (uchar) (dst_pix[indexImg1] +
    211                              (uchar) (((unsigned int) (second_pix[begLineIndex]) * s1) >> 8));
    212 
    213                 indexImg1++;
    214 
    215                 /* Blend G */
    216                 dst_pix[indexImg1] =
    217                     (uchar) (dst_pix[indexImg1] +
    218                              (uchar) (((unsigned int) (second_pix[begLineIndex + 1]) * s1) >>
    219                                       8));
    220 
    221                 indexImg1++;
    222 
    223                 /* Blend B */
    224                 dst_pix[indexImg1] =
    225                     (uchar) (dst_pix[indexImg1] +
    226                              (uchar) (((unsigned int) (second_pix[begLineIndex + 2]) * s1) >>
    227                                       8));
    228 
    229                 indexImg1++;
    230 
    231                 begLine += step;
    232 
    233             }                   /* for */
    234         }
    235         else
    236         {
    237 
    238             for( ; begDestLine < endDestLine; begDestLine++ )
    239             {
    240                 /* for each pixel */
    241 
    242                 begLineIndex = (int) begLine;
    243                 begLineIndex *= 3;
    244 
    245                 /* Blend R */
    246                 dst_pix[indexImg1] = (uchar) (dst_pix[indexImg1] + second_pix[begLineIndex]);
    247                 indexImg1++;
    248 
    249                 /* Blend G */
    250                 dst_pix[indexImg1] =
    251                     (uchar) (dst_pix[indexImg1] + second_pix[begLineIndex + 1]);
    252                 indexImg1++;
    253 
    254                 /* Blend B */
    255                 dst_pix[indexImg1] =
    256                     (uchar) (dst_pix[indexImg1] + second_pix[begLineIndex + 2]);
    257                 /*assert(indexImg1 < dst_len); */
    258 
    259                 indexImg1++;
    260 
    261                 begLine += step;
    262 
    263             }                   /* for */
    264         }                       /* if */
    265 
    266         begLineIndex = endLineIndex;
    267         begLine = endLine;
    268 
    269     }                           /* for each runs in second line */
    270 
    271     return CV_NO_ERR;
    272 
    273 }                               /* icvMorphEpilines8uC3 */
    274 
    275 
    276 /*======================================================================================*/
    277 
    278 static CvStatus
    279 icvMorphEpilines8uC3Multi( int lines,   /* number of lines                              */
    280                            uchar * first_pix,   /* raster epilines from the first image         */
    281                            int *first_num,      /* numbers of pixel in first line               */
    282                            uchar * second_pix,  /* raster epilines from the second image        */
    283                            int *second_num,     /* numbers of pixel in second line              */
    284                            uchar * dst_pix,     /* raster epiline from the destination image    */
    285                            /* (it's an output parameter)                   */
    286                            int *dst_num,        /* numbers of pixel in output line              */
    287                            float alpha, /* relative position of camera                  */
    288                            int *first,  /* first sequence of runs                       */
    289                            int *first_runs,     /* it's length                                  */
    290                            int *second, /* second sequence of runs                      */
    291                            int *second_runs, int *first_corr,   /* correspond information for the 1st seq       */
    292                            int *second_corr )   /* correspond information for the 2nd seq       */
    293 {
    294     CvStatus error;
    295     int currLine;
    296     int currFirstPix = 0;
    297     //int currFirstNum = 0;
    298     int currSecondPix = 0;
    299     //int currSecondNum = 0;
    300     int currDstPix = 0;
    301     int currFirst = 0;
    302     //int currFirstRuns = 0;
    303     int currSecond = 0;
    304     //int currSecondRuns = 0;
    305     int currFirstCorr = 0;
    306     int currSecondCorr = 0;
    307 
    308     if( lines < 1 ||
    309         first_pix == 0 ||
    310         first_num == 0 ||
    311         second_pix == 0 ||
    312         second_num == 0 ||
    313         dst_pix == 0 ||
    314         dst_num == 0 ||
    315         alpha < 0 ||
    316         alpha > 1 ||
    317         first == 0 ||
    318         first_runs == 0 ||
    319         second == 0 || second_runs == 0 || first_corr == 0 || second_corr == 0 )
    320         return CV_BADFACTOR_ERR;
    321 
    322     for( currLine = 0; currLine < lines; currLine++ )
    323     {
    324 
    325         error = icvMorphEpilines8uC3( &(first_pix[currFirstPix]),
    326                                       &(second_pix[currSecondPix]),
    327                                       &(dst_pix[currDstPix]),
    328                                       alpha,
    329                                       &(first[currFirst]),
    330                                       first_runs[currLine],
    331                                       &(second[currSecond]),
    332                                       second_runs[currLine],
    333                                       &(first_corr[currFirstCorr]),
    334                                       &(second_corr[currSecondCorr]), dst_num[currLine] * 3 );
    335 
    336 
    337         if( error != CV_NO_ERR )
    338             return CV_NO_ERR;
    339 
    340         currFirstPix += first_num[currLine] * 3;
    341         currSecondPix += second_num[currLine] * 3;
    342         currDstPix += dst_num[currLine] * 3;
    343         currFirst += (first_runs[currLine] * 2) + 1;
    344         currSecond += (second_runs[currLine] * 2) + 1;
    345         currFirstCorr += first_runs[currLine] * 2;
    346         currSecondCorr += second_runs[currLine] * 2;
    347 
    348     }                           /* for */
    349 
    350     return CV_NO_ERR;
    351 
    352 }                               /* icvMorphEpilines8uC3Multi */
    353 
    354 
    355 
    356 
    357 /*======================================================================================*/
    358 
    359 CV_IMPL void
    360 cvMorphEpilinesMulti( int lines,        /* number of lines             */
    361                       uchar * first_pix,        /* raster epilines from the first image      */
    362                       int *first_num,   /* numbers of pixel in first line            */
    363                       uchar * second_pix,       /* raster epilines from the second image     */
    364                       int *second_num,  /* numbers of pixel in second line           */
    365                       uchar * dst_pix,  /* raster epiline from the destination image */
    366                       /* (it's an output parameter)                */
    367                       int *dst_num,     /* numbers of pixel in output line           */
    368                       float alpha,      /* relative position of camera               */
    369                       int *first,       /* first sequence of runs                    */
    370                       int *first_runs,  /* it's length                               */
    371                       int *second,      /* second sequence of runs                   */
    372                       int *second_runs, int *first_corr,        /* correspond information for the 1st seq    */
    373                       int *second_corr  /* correspond information for the 2nd seq     */
    374      )
    375 {
    376     CV_FUNCNAME( "cvMorphEpilinesMulti" );
    377     __BEGIN__;
    378 
    379     IPPI_CALL( icvMorphEpilines8uC3Multi( lines,        /* number of lines                           */
    380                                           first_pix,    /* raster epilines from the first image      */
    381                                           first_num,    /* numbers of pixel in first line            */
    382                                           second_pix,   /* raster epilines from the second image     */
    383                                           second_num,   /* numbers of pixel in second line           */
    384                                           dst_pix,      /* raster epiline from the destination image */
    385                                           /* (it's an output parameter)                   */
    386                                           dst_num,      /* numbers of pixel in output line           */
    387                                           alpha,        /* relative position of camera               */
    388                                           first,        /* first sequence of runs                    */
    389                                           first_runs,   /* it's length                               */
    390                                           second,       /* second sequence of runs                   */
    391                                           second_runs, first_corr,      /* correspond information for the 1st seq    */
    392                                           second_corr   /* correspond information for the 2nd seq     */
    393                 ));
    394     __END__;
    395 }
    396 
    397