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#ifndef _CV_VM_H_
43#define _CV_VM_H_
44
45/*----------------------- Internal ViewMorphing Functions ------------------------------*/
46
47/*======================================================================================*/
48
49typedef struct CvMatrix4
50{
51    float m[4][4];
52}
53CvMatrix4;
54
55
56/* Scanline section. Find coordinates by fundamental matrix */
57
58/* Epsilon and real zero */
59#define EPSILON             1.e-4
60//#define REAL_ZERO(x)        ( (x) < EPSILON && (x) > -EPSILON)
61#define REAL_ZERO(x) ( (x) < 1e-8 && (x) > -1e-8)
62
63#define SIGN(x)				( (x)<0 ? -1:((x)>0?1:0 ) )
64
65CvStatus  icvMakeScanlinesLengths( int*        scanlines,
66                                    int         numlines,
67                                    int*        lens);
68
69/*=============================== PreWarp section ======================================*/
70
71CV_INLINE int icvGetColor(uchar* valueRGB);
72
73CvStatus  icvFindRunsInOneImage(
74                                int     numLines,       /* number of scanlines		*/
75                                uchar*  prewarp,        /* prewarp image 			*/
76                                int*    line_lens,      /* line lengths in pixels	*/
77                                int*    runs,           /* result runs				*/
78                                int*    num_runs);
79
80/*================================ Morphing section ====================================*/
81
82CvStatus  icvMorphEpilines8uC3(    uchar*  first_pix, /* raster epiline from the first image       */
83                                    uchar*  second_pix, /* raster epiline from the second image      */
84                                    uchar*  dst_pix,    /* raster epiline from the destination image */
85                                                        /* (it's an output parameter)                */
86                                    float   alpha,      /* relative position of camera               */
87                                    int*    first,      /* first sequence of runs                    */
88                                    int     first_runs, /* it's length                               */
89                                    int*    second,     /* second sequence of runs                   */
90                                    int     second_runs,
91                                    int*    first_corr, /* correspond information for the 1st seq    */
92                                    int*    second_corr,
93                                    int     dst_len);   /* correspond information for the 2nd seq    */
94
95/*========================== Dynamic correspond section ================================*/
96
97CvStatus  icvDynamicCorrespond(   int*  first,         /* first sequence of runs           */
98                                                         /* s0|w0|s1|w1|...|s(n-1)|w(n-1)|sn */
99                                    int   first_runs,    /* number of runs                   */
100                                    int*  second,        /* second sequence of runs          */
101                                    int   second_runs,
102                                    int*  first_corr,    /* s0'|e0'|s1'|e1'|...              */
103                                    int*  second_corr );
104
105/*============================= PostWarp Functions =====================================*/
106
107CvStatus  icvFetchLine8uC3R(
108                                uchar*   src,  int   src_step,
109                                uchar*   dst,  int*  dst_num,
110                                CvSize  src_size,
111                                CvPoint start,
112                                CvPoint end );
113
114CvStatus  icvDrawLine8uC3R(
115                                uchar*   src,  int  src_num,
116                                uchar*   dst,  int  dst_step,
117                                CvSize  dst_size,
118                                CvPoint start,
119                                CvPoint end );
120
121
122/*============================== Fundamental Matrix Functions ==========================*/
123CvStatus  icvPoint7(  int*        points1,
124                        int*        points2,
125                        double*     F,
126                        int*        amount
127                        );
128
129CvStatus  icvCubic(      double a2, double a1,
130                            double a0, double* squares );
131
132double icvDet( double* M );
133double   icvMinor( double* M, int x, int y );
134
135int
136icvGaussMxN( double *A, double *B, int M, int N, double **solutions );
137
138CvStatus
139icvGetCoef( double *f1, double *f2, double *a2, double *a1, double *a0 );
140
141/*================================= Scanlines Functions ================================*/
142
143CvStatus  icvGetCoefficient(  CvMatrix3*     matrix,
144                                CvSize         imgSize,
145                                int*            scanlines_1,
146                                int*            scanlines_2,
147                                int*            numlines);
148
149CvStatus  icvGetCoefficientDefault(   CvMatrix3*     matrix,
150                                        CvSize         imgSize,
151                                        int*            scanlines_1,
152                                        int*            scanlines_2,
153                                        int*            numlines);
154
155CvStatus  icvGetCoefficientStereo(    CvMatrix3*     matrix,
156                                        CvSize         imgSize,
157                                        float*          l_epipole,
158                                        float*          r_epipole,
159                                        int*            scanlines_1,
160                                        int*            scanlines_2,
161                                        int*            numlines
162                                    );
163
164CvStatus  icvGetCoefficientOrto(  CvMatrix3*     matrix,
165                                    CvSize         imgSize,
166                                    int*            scanlines_1,
167                                    int*            scanlines_2,
168                                    int*            numlines);
169
170
171CvStatus  icvGetCrossEpilineFrame(    CvSize     imgSize,
172                                        float*      epiline,
173                                        int*        x1,
174                                        int*        y1,
175                                        int*        x2,
176                                        int*        y2
177                                    );
178
179CvStatus  icvBuildScanlineLeftStereo(
180                                        CvSize         imgSize,
181                                        CvMatrix3*     matrix,
182                                        float*          l_epipole,
183                                        float*          l_angle,
184                                        float           l_radius,
185                                        int*            scanlines_1,
186                                        int*            scanlines_2,
187                                        int*            numlines);
188
189CvStatus  icvBuildScanlineRightStereo(
190                                        CvSize         imgSize,
191                                        CvMatrix3*     matrix,
192                                        float*          r_epipole,
193                                        float*          r_angle,
194                                        float           r_radius,
195                                        int*            scanlines_1,
196                                        int*            scanlines_2,
197                                        int*            numlines);
198
199CvStatus  icvGetStartEnd1(
200                                    CvMatrix3*     matrix,
201                                    CvSize         imgSize,
202                                    float*          l_start_end,
203                                    float*          r_start_end );
204
205CvStatus  icvGetStartEnd2(
206                                    CvMatrix3*     matrix,
207                                    CvSize         imgSize,
208                                    float*          l_start_end,
209                                    float*          r_start_end );
210
211CvStatus  icvGetStartEnd3(
212                                    CvMatrix3*     matrix,
213                                    CvSize         imgSize,
214                                    float*          l_start_end,
215                                    float*          r_start_end );
216
217CvStatus  icvGetStartEnd4(
218                                    CvMatrix3*     matrix,
219                                    CvSize         imgSize,
220                                    float*          l_start_end,
221                                    float*          r_start_end );
222
223CvStatus  icvBuildScanlineLeft(
224                                    CvMatrix3*     matrix,
225                                    CvSize         imgSize,
226                                    int*            scanlines_1,
227                                    int*            scanlines_2,
228                                    float*          l_start_end,
229                                    int*            numlines
230                                    );
231
232CvStatus  icvBuildScanlineRight(
233                                    CvMatrix3*     matrix,
234                                    CvSize         imgSize,
235                                    int*            scanlines_1,
236                                    int*            scanlines_2,
237                                    float*          r_start_end,
238                                    int*            numlines
239                                    );
240
241
242/*=================================== LMedS Functions ==================================*/
243CvStatus  icvLMedS7(
244                        int*            points1,
245                        int*            points2,
246                        CvMatrix3*     matrix);
247
248
249CvStatus  icvLMedS(   int*    points1,
250                        int*    points2,
251                        int     numPoints,
252                        CvMatrix3* fundamentalMatrix );
253
254
255/*
256CvStatus  icvFindFundamentalMatrix(
257                                    int*            points1,
258                                    int*            points2,
259                                    int             numpoints,
260                                    int             method,
261                                    CvMatrix3*      matrix);
262*/
263void   icvChoose7(	int*    ml,     int* mr,
264					    int     num,	int* ml7,
265					    int*   mr7 );
266
267double icvMedian(	int* ml, int* mr,
268				    int num, double* F );
269
270int icvBoltingPoints( int* ml,	    int* mr,
271					    int num,        double* F,
272					    double Mj,      int* *new_ml,
273					    int* *new_mr,   int* new_num);
274
275CvStatus  icvPoints8( int* ml, int* mr,
276                        int num, double* F );
277
278CvStatus  icvRank2Constraint( double* F );
279
280CvStatus  icvSort( double* array, int length );
281
282double icvAnalyticPoints8(	double* A,
283											int num, double* F );
284
285int icvSingularValueDecomposition(	int		M,
286										int		N,
287										double*	A,
288										double*	W,
289										int		get_U,
290										double*	U,
291										int		get_V,
292										double*	V
293												 );
294
295
296/*======================================================================================*/
297#endif/*_CV_VM_H_*/
298
299