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 "_cvvm.h"
43 
44 /* Valery Mosyagin */
45 
46 static CvStatus
icvFindRuns(int numLines,uchar * prewarp_1,uchar * prewarp_2,int * line_lens_1,int * line_lens_2,int * runs_1,int * runs_2,int * num_runs_1,int * num_runs_2)47 icvFindRuns( int numLines,      /* number of scanlines      */
48              uchar * prewarp_1, /* prewarp image 1          */
49              uchar * prewarp_2, /* prewarp image 2          */
50              int *line_lens_1,  /* line lengths 1           */
51              int *line_lens_2,  /* line lengths 2           */
52              int *runs_1,       /* result runs  1           */
53              int *runs_2,       /* result runs  2           */
54              int *num_runs_1,   /* numbers of first runs    */
55              int *num_runs_2 )
56 {
57     CvStatus err;
58 
59     err = icvFindRunsInOneImage( numLines, prewarp_1, line_lens_1, runs_1, num_runs_1 );
60 
61     if( err != CV_NO_ERR )
62         return err;
63 
64     err = icvFindRunsInOneImage( numLines, prewarp_2, line_lens_2, runs_2, num_runs_2 );
65 
66     return err;
67 
68 }
69 
70 
71 /*======================================================================================*/
72 
73 CV_INLINE int
icvGetColor(uchar * valueRGB)74 icvGetColor( uchar * valueRGB )
75 {
76     int R = *valueRGB;
77     int G = *(valueRGB + 1);
78     int B = *(valueRGB + 2);
79 
80     return ( ((R + G + B) >> 3) & 0xFFFC );
81 }                               /* vm_GetColor */
82 
83 
84 /*======================================================================================*/
85 
86 CvStatus
icvFindRunsInOneImage(int numLines,uchar * prewarp,int * line_lens,int * runs,int * num_runs)87 icvFindRunsInOneImage( int numLines,    /* number of scanlines      */
88                        uchar * prewarp, /* prewarp image            */
89                        int *line_lens,  /* line lengths in pixels   */
90                        int *runs,       /* result runs              */
91                        int *num_runs )
92 {
93     int epiLine;
94     int run_index;
95     int curr_color;
96     int index;
97     int color;
98     uchar *curr_point;
99     int num;
100 
101 
102     run_index = 0;
103 
104     curr_point = prewarp;
105 
106     for( epiLine = 0; epiLine < numLines; epiLine++ )
107     {
108 
109         curr_color = icvGetColor( curr_point );
110 
111         runs[run_index++] = 0;
112         runs[run_index++] = curr_color;
113 
114         curr_point += 3;
115 
116         num = 1;
117         for( index = 1; index < line_lens[epiLine]; index++ )
118         {
119 
120             color = icvGetColor( curr_point );
121 
122             if( color != curr_color )
123             {
124                 runs[run_index++] = index;
125                 runs[run_index++] = color;
126                 curr_color = color;
127                 num++;
128             }
129 
130             curr_point += 3;
131         }
132 
133         runs[run_index++] = index;
134         num_runs[epiLine] = num;
135     }
136 
137     return CV_NO_ERR;
138 }
139 
140 
141 /*======================================================================================*/
142 
143 CV_IMPL void
cvFindRuns(int numLines,uchar * prewarp_1,uchar * prewarp_2,int * line_lens_1,int * line_lens_2,int * runs_1,int * runs_2,int * num_runs_1,int * num_runs_2)144 cvFindRuns( int numLines,       /* number of scanlines   */
145             uchar * prewarp_1,  /* prewarp image 1       */
146             uchar * prewarp_2,  /* prewarp image 2       */
147             int *line_lens_1,   /* line lengths 1        */
148             int *line_lens_2,   /* line lengths 2        */
149             int *runs_1,        /* result runs  1        */
150             int *runs_2,        /* result runs  2        */
151             int *num_runs_1,    /* numbers of first runs */
152             int *num_runs_2 )
153 {
154     CV_FUNCNAME( "cvFindRuns" );
155     __BEGIN__;
156 
157     IPPI_CALL( icvFindRuns( numLines,   /* number of scanlines   */
158                             prewarp_1,  /* prewarp image 1       */
159                             prewarp_2,  /* prewarp image 2       */
160                             line_lens_1,        /* line lengths 1        */
161                             line_lens_2,        /* line lengths 2        */
162                             runs_1,     /* result runs  1        */
163                             runs_2,     /* result runs  2        */
164                             num_runs_1, /* numbers of first runs */
165                             num_runs_2 ));
166     __CLEANUP__;
167     __END__;
168 }
169