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
icvMorphEpilines8uC3(uchar * first_pix,uchar * second_pix,uchar * dst_pix,float alpha,int * first,int first_runs,int * second,int second_runs,int * first_corr,int * second_corr,int dst_len)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
icvMorphEpilines8uC3Multi(int lines,uchar * first_pix,int * first_num,uchar * second_pix,int * second_num,uchar * dst_pix,int * dst_num,float alpha,int * first,int * first_runs,int * second,int * second_runs,int * first_corr,int * second_corr)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
cvMorphEpilinesMulti(int lines,uchar * first_pix,int * first_num,uchar * second_pix,int * second_num,uchar * dst_pix,int * dst_num,float alpha,int * first,int * first_runs,int * second,int * second_runs,int * first_corr,int * second_corr)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