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