16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cvaux.h"
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cvvm.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//#define REAL_ZERO(x) ( (x) < 1e-8 && (x) > -1e-8)
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetNormalVector3( CvMatrix3 * Matrix, float *v )
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*  return vector v that is any 3-vector perpendicular
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    to all the row vectors of Matrix */
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double *solutions = 0;
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double M[3 * 3];
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double B[3] = { 0.f, 0.f, 0.f };
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, res;
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( Matrix == 0 || v == 0 )
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < 3; i++ )
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < 3; j++ )
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            M[i * 3 + j] = (double) (Matrix->m[i][j]);
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* for */
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    res = icvGaussMxN( M, B, 3, 3, &solutions );
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( res == -1 )
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( res > 0 && solutions )
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        v[0] = (float) solutions[0];
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        v[1] = (float) solutions[1];
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        v[2] = (float) solutions[2];
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        res = 0;
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        res = 1;
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( solutions )
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &solutions );
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( res )
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NO_ERR;
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvgetNormalVector3 */
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*=====================================================================================*/
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMultMatrixVector3( CvMatrix3 * m, float *src, float *dst )
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( m == 0 || src == 0 || dst == 0 )
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[0] = m->m[0][0] * src[0] + m->m[0][1] * src[1] + m->m[0][2] * src[2];
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[1] = m->m[1][0] * src[0] + m->m[1][1] * src[1] + m->m[1][2] * src[2];
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[2] = m->m[2][0] * src[0] + m->m[2][1] * src[1] + m->m[2][2] * src[2];
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvMultMatrixVector3 */
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*=====================================================================================*/
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMultMatrixTVector3( CvMatrix3 * m, float *src, float *dst )
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( m == 0 || src == 0 || dst == 0 )
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[0] = m->m[0][0] * src[0] + m->m[1][0] * src[1] + m->m[2][0] * src[2];
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[1] = m->m[0][1] * src[0] + m->m[1][1] * src[1] + m->m[2][1] * src[2];
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[2] = m->m[0][2] * src[0] + m->m[1][2] * src[1] + m->m[2][2] * src[2];
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvMultMatrixTVector3 */
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*=====================================================================================*/
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCrossLines( float *line1, float *line2, float *cross_point )
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta;
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( line1 == 0 && line2 == 0 && cross_point == 0 )
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta = line1[0] * line2[1] - line1[1] * line2[0];
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( REAL_ZERO( delta ))
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cross_point[0] = (-line1[2] * line2[1] + line1[1] * line2[2]) / delta;
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cross_point[1] = (-line1[0] * line2[2] + line1[2] * line2[0]) / delta;
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cross_point[2] = 1;
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvCrossLines */
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*======================================================================================*/
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMakeScanlines( CvMatrix3 * matrix,
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  CvSize imgSize,
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  int *scanlines_1, int *scanlines_2, int *lens_1, int *lens_2, int *numlines )
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error;
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvGetCoefficient( matrix, imgSize, scanlines_2, scanlines_1, numlines );
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Make Length of scanlines */
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( scanlines_1 == 0 && scanlines_2 == 0 )
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return error;
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMakeScanlinesLengths( scanlines_1, *numlines, lens_1 );
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMakeScanlinesLengths( scanlines_2, *numlines, lens_2 );
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    matrix = matrix;
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvMakeScanlines */
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*======================================================================================*/
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMakeScanlinesLengths( int *scanlines, int numlines, int *lens )
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int index;
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x1, y1, x2, y2, dx, dy;
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int curr;
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    curr = 0;
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( index = 0; index < numlines; index++ )
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = scanlines[curr++];
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 = scanlines[curr++];
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = scanlines[curr++];
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 = scanlines[curr++];
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dx = abs( x1 - x2 ) + 1;
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = abs( y1 - y2 ) + 1;
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        lens[index] = MAX( dx, dy );
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*======================================================================================*/
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMakeAlphaScanlines( int *scanlines_1,
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int *scanlines_2,
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int *scanlines_a, int *lens, int numlines, float alpha )
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int index;
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x1, y1, x2, y2;
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int curr;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dx, dy;
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int curr_len;
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    curr = 0;
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    curr_len = 0;
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( index = 0; index < numlines; index++ )
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = (int) (scanlines_1[curr] * alpha + scanlines_2[curr] * (1.0 - alpha));
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_a[curr++] = x1;
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 = (int) (scanlines_1[curr] * alpha + scanlines_2[curr] * (1.0 - alpha));
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_a[curr++] = y1;
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = (int) (scanlines_1[curr] * alpha + scanlines_2[curr] * (1.0 - alpha));
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_a[curr++] = x2;
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 = (int) (scanlines_1[curr] * alpha + scanlines_2[curr] * (1.0 - alpha));
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_a[curr++] = y2;
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dx = abs( x1 - x2 ) + 1;
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = abs( y1 - y2 ) + 1;
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        lens[curr_len++] = MAX( dx, dy );
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*======================================================================================*/
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* //////////////////////////////////////////////////////////////////////////////////// */
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetCoefficient( CvMatrix3 * matrix,
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   CvSize imgSize, int *scanlines_1, int *scanlines_2, int *numlines )
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_epipole[3];
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_epipole[3];
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 Ft;
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error;
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j;
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_epipole[2] = -1;
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_epipole[2] = -1;
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( F == 0 )
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCoefficientDefault( matrix,
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          imgSize, scanlines_1, scanlines_2, numlines );
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return error;
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < 3; i++ )
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < 3; j++ )
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Ft.m[i][j] = F->m[j][i];
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvGetNormalVector3( &Ft, l_epipole );
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( error == CV_NO_ERR && !REAL_ZERO( l_epipole[2] ) && !REAL_ZERO( l_epipole[2] - 1 ))
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_epipole[0] /= l_epipole[2];
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_epipole[1] /= l_epipole[2];
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_epipole[2] = 1;
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvGetNormalVector3( F, r_epipole );
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( error == CV_NO_ERR && !REAL_ZERO( r_epipole[2] ) && !REAL_ZERO( r_epipole[2] - 1 ))
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_epipole[0] /= r_epipole[2];
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_epipole[1] /= r_epipole[2];
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_epipole[2] = 1;
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( REAL_ZERO( l_epipole[2] - 1 ) && REAL_ZERO( r_epipole[2] - 1 ))
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCoefficientStereo( matrix,
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         imgSize,
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         l_epipole,
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         r_epipole, scanlines_1, scanlines_2, numlines );
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( error == CV_NO_ERR )
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_NO_ERR;
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( REAL_ZERO( l_epipole[2] ) && REAL_ZERO( r_epipole[2] ))
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvGetCoefficientOrto( matrix,
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           imgSize, scanlines_1, scanlines_2, numlines );
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( error == CV_NO_ERR )
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_NO_ERR;
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvGetCoefficientDefault( matrix, imgSize, scanlines_1, scanlines_2, numlines );
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetCoefficient */
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetCoefficientDefault( CvMatrix3 * matrix,
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          CvSize imgSize, int *scanlines_1, int *scanlines_2, int *numlines )
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int curr;
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y;
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = imgSize.height;
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( scanlines_1 == 0 && scanlines_2 == 0 )
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NO_ERR;
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    curr = 0;
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < imgSize.height; y++ )
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_1[curr] = 0;
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_1[curr + 1] = y;
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_1[curr + 2] = imgSize.width - 1;
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_1[curr + 3] = y;
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_2[curr] = 0;
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_2[curr + 1] = y;
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_2[curr + 2] = imgSize.width - 1;
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        scanlines_2[curr + 3] = y;
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        curr += 4;
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    matrix = matrix;
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetCoefficientDefault */
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetCoefficientOrto( CvMatrix3 * matrix,
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize imgSize, int *scanlines_1, int *scanlines_2, int *numlines )
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_start_end[4], r_start_end[4];
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double a, b;
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error;
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( F->m[0][2] * F->m[1][2] < 0 )
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                           /* on left / */
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( F->m[2][0] * F->m[2][1] < 0 )
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* on right / */
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvGetStartEnd1( F, imgSize, l_start_end, r_start_end );
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* on right \ */
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvGetStartEnd2( F, imgSize, l_start_end, r_start_end );
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                           /* on left \ */
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( F->m[2][0] * F->m[2][1] < 0 )
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* on right / */
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvGetStartEnd3( F, imgSize, l_start_end, r_start_end );
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* on right \ */
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvGetStartEnd4( F, imgSize, l_start_end, r_start_end );
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( error != CV_NO_ERR )
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return error;
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = fabs( l_start_end[0] - l_start_end[2] );
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = fabs( r_start_end[0] - r_start_end[2] );
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( a > b )
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanlineLeft( F,
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      imgSize,
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      scanlines_1, scanlines_2, l_start_end, numlines );
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanlineRight( F,
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                       imgSize,
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                       scanlines_1, scanlines_2, r_start_end, numlines );
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetCoefficientOrto */
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetStartEnd1( CvMatrix3 * matrix, CvSize imgSize, float *l_start_end, float *r_start_end )
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int width, height;
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_diagonal[3];
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_diagonal[3];
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3], r_point[3], epiline[3];
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = imgSize.width - 1;
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = imgSize.height - 1;
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[0] = (float) 1 / width;
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[1] = (float) 1 / height;
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[2] = -1;
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[0] = (float) 1 / width;
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[1] = (float) 1 / height;
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[2] = -1;
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = (float) width;
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = 0;
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[0] = l_point[0];
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[1] = l_point[1];
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[0] = r_point[0];
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[1] = r_point[1];
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = 0;
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = (float) height;
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[2] = l_point[0];
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[3] = l_point[1];
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[2] = r_point[0];
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[3] = r_point[1];
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetStartEnd1 */
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetStartEnd2( CvMatrix3 * matrix, CvSize imgSize, float *l_start_end, float *r_start_end )
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int width, height;
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_diagonal[3];
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_diagonal[3];
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3], r_point[3], epiline[3];
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = imgSize.width - 1;
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = imgSize.height - 1;
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[0] = (float) 1 / width;
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[1] = (float) 1 / height;
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[2] = -1;
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[0] = (float) height / width;
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[1] = -1;
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[2] = 0;
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = 0;
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = 0;
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[0] = l_point[0];
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[1] = l_point[1];
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[0] = r_point[0];
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[1] = r_point[1];
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = (float) width;
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = (float) height;
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[2] = l_point[0];
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[3] = l_point[1];
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[2] = r_point[0];
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[3] = r_point[1];
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetStartEnd2 */
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetStartEnd3( CvMatrix3 * matrix, CvSize imgSize, float *l_start_end, float *r_start_end )
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int width, height;
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_diagonal[3];
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_diagonal[3];
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3], r_point[3], epiline[3];
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = imgSize.width - 1;
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = imgSize.height - 1;
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[0] = (float) height / width;
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[1] = -1;
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[2] = 0;
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[0] = (float) 1 / width;
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[1] = (float) 1 / height;
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[2] = -1;
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = 0;
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = 0;
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[0] = l_point[0];
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[1] = l_point[1];
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[0] = r_point[0];
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[1] = r_point[1];
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = (float) width;
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = (float) height;
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[2] = l_point[0];
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[3] = l_point[1];
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[2] = r_point[0];
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[3] = r_point[1];
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetStartEnd3 */
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetStartEnd4( CvMatrix3 * matrix, CvSize imgSize, float *l_start_end, float *r_start_end )
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int width, height;
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_diagonal[3];
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_diagonal[3];
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3], r_point[3], epiline[3];
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error;
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = imgSize.width - 1;
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = imgSize.height - 1;
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[0] = (float) height / width;
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[1] = -1;
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_diagonal[2] = 0;
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[0] = (float) height / width;
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[1] = -1;
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_diagonal[2] = 0;
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = 0;
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = 0;
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( error != CV_NO_ERR )
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return error;
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[0] = l_point[0];
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[1] = l_point[1];
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[0] = r_point[0];
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[1] = r_point[1];
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[0] = l_point[0];
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[1] = l_point[1];
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[0] = r_point[0];
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[1] = r_point[1];
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = (float) width;
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = (float) height;
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, epiline );
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvCrossLines( l_diagonal, epiline, l_point );
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( error == CV_NO_ERR );
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_point[0] >= 0 && l_point[0] <= width )
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[2] = l_point[0];
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_start_end[3] = l_point[1];
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[2] = r_point[0];
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_start_end[3] = r_point[1];
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_point[0] < 0 )
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = 0;
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = 0;
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                       /* if( l_point[0] > width ) */
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = (float) width;
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = (float) height;
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[2] = 1;
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvMultMatrixTVector3( F, l_point, epiline );
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvCrossLines( r_diagonal, epiline, r_point );
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( error == CV_NO_ERR );
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( r_point[0] >= 0 && r_point[0] <= width )
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[2] = l_point[0];
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l_start_end[3] = l_point[1];
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[2] = r_point[0];
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r_start_end[3] = r_point[1];
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADFACTOR_ERR;
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetStartEnd4 */
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBuildScanlineLeft( CvMatrix3 * matrix,
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize imgSize,
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int *scanlines_1, int *scanlines_2, float *l_start_end, int *numlines )
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int prewarp_height;
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3];
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_point[3];
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float height;
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta_x;
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta_y;
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float i;
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int offset;
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float epiline[3];
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double a, b;
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( l_start_end != 0 );
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = fabs( l_start_end[2] - l_start_end[0] );
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = fabs( l_start_end[3] - l_start_end[1] );
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    prewarp_height = cvRound( MAX(a, b) );
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( scanlines_1 == 0 && scanlines_2 == 0 )
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NO_ERR;
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_point[2] = 1;
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) prewarp_height;
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_x = (l_start_end[2] - l_start_end[0]) / height;
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[0] += delta_x;
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[2] -= delta_x;
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_x = (l_start_end[2] - l_start_end[0]) / height;
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_y = (l_start_end[3] - l_start_end[1]) / height;
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[1] += delta_y;
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[3] -= delta_y;
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_y = (l_start_end[3] - l_start_end[1]) / height;
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0, offset = 0; i < height; i++, offset += 4 )
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[0] = l_start_end[0] + i * delta_x;
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[1] = l_start_end[1] + i * delta_y;
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixTVector3( F, l_point, epiline );
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, epiline,
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset,
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 1,
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 2, scanlines_2 + offset + 3 );
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( error == CV_NO_ERR );
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[0] = -(float) (*(scanlines_2 + offset));
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[1] = -(float) (*(scanlines_2 + offset + 1));
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[2] = -1;
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixVector3( F, r_point, epiline );
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, epiline,
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset,
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 1,
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 2, scanlines_1 + offset + 3 );
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( error == CV_NO_ERR );
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* for */
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} /*icvlBuildScanlineLeft */
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBuildScanlineRight( CvMatrix3 * matrix,
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize imgSize,
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int *scanlines_1, int *scanlines_2, float *r_start_end, int *numlines )
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int prewarp_height;
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3];
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_point[3];
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float height;
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta_x;
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta_y;
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float i;
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int offset;
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float epiline[3];
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double a, b;
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( r_start_end != 0 );
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = fabs( r_start_end[2] - r_start_end[0] );
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = fabs( r_start_end[3] - r_start_end[1] );
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    prewarp_height = cvRound( MAX(a, b) );
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( scanlines_1 == 0 && scanlines_2 == 0 )
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NO_ERR;
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) prewarp_height;
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_x = (r_start_end[2] - r_start_end[0]) / height;
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[0] += delta_x;
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[2] -= delta_x;
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_x = (r_start_end[2] - r_start_end[0]) / height;
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_y = (r_start_end[3] - r_start_end[1]) / height;
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[1] += delta_y;
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[3] -= delta_y;
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta_y = (r_start_end[3] - r_start_end[1]) / height;
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0, offset = 0; i < height; i++, offset += 4 )
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[0] = r_start_end[0] + i * delta_x;
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[1] = r_start_end[1] + i * delta_y;
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixVector3( F, r_point, epiline );
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, epiline,
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset,
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 1,
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 2, scanlines_1 + offset + 3 );
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( error == CV_NO_ERR );
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[0] = -(float) (*(scanlines_1 + offset));
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[1] = -(float) (*(scanlines_1 + offset + 1));
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[2] = -1;
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixTVector3( F, l_point, epiline );
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, epiline,
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset,
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 1,
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 2, scanlines_2 + offset + 3 );
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( error == CV_NO_ERR );
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* for */
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} /*icvlBuildScanlineRight */
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define Abs(x)              ( (x)<0 ? -(x):(x) )
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define Sgn(x)              ( (x)<0 ? -1:1 )    /* Sgn(0) = 1 ! */
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBuildScanline( CvSize imgSize, float *epiline, float *kx, float *cx, float *ky, float *cy )
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float point[4][2], d;
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sign[4], i;
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float width, height;
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( REAL_ZERO( epiline[0] ) && REAL_ZERO( epiline[1] ))
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = (float) imgSize.width - 1;
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) imgSize.height - 1;
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[0] = Sgn( epiline[2] );
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[1] = Sgn( epiline[0] * width + epiline[2] );
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[2] = Sgn( epiline[1] * height + epiline[2] );
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[3] = Sgn( epiline[0] * width + epiline[1] * height + epiline[2] );
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    i = 0;
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[0] * sign[1] < 0 )
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = -epiline[2] / epiline[0];
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = 0;
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i++;
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[0] * sign[2] < 0 )
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = 0;
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = -epiline[2] / epiline[1];
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i++;
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[1] * sign[3] < 0 )
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = width;
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = -(epiline[0] * width + epiline[2]) / epiline[1];
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i++;
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[2] * sign[3] < 0 )
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = -(epiline[1] * height + epiline[2]) / epiline[0];
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = height;
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[0] == sign[1] && sign[0] == sign[2] && sign[0] == sign[3] )
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !kx && !ky && !cx && !cy )
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( kx && ky )
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *kx = -epiline[1];
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *ky = epiline[0];
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d = (float) MAX( Abs( *kx ), Abs( *ky ));
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *kx /= d;
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *ky /= d;
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cx && cy )
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (point[0][0] - point[1][0]) * epiline[1] +
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (point[1][1] - point[0][1]) * epiline[0] > 0 )
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *cx = point[0][0];
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *cy = point[0][1];
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *cx = point[1][0];
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *cy = point[1][1];
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlBuildScanline */
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetCoefficientStereo( CvMatrix3 * matrix,
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvSize imgSize,
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         float *l_epipole,
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         float *r_epipole, int *scanlines_1, int *scanlines_2, int *numlines )
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, turn;
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float width, height;
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_angle[2], r_angle[2];
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_radius, r_radius;
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_point[3], l_point[3];
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_epiline[3], r_epiline[3], x, y;
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float swap;
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float radius1, radius2, radius3, radius4;
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_start_end[4], r_start_end[4];
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error;
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float Region[3][3][4] = {
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       {{0.f, 0.f, 1.f, 1.f}, {0.f, 1.f, 1.f, 1.f}, {0.f, 1.f, 1.f, 0.f}},
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {{0.f, 0.f, 0.f, 1.f}, {2.f, 2.f, 2.f, 2.f}, {1.f, 1.f, 1.f, 0.f}},
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {{1.f, 0.f, 0.f, 1.f}, {1.f, 0.f, 0.f, 0.f}, {1.f, 1.f, 0.f, 0.f}}
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = (float) imgSize.width - 1;
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) imgSize.height - 1;
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( F->m[0][0] * F->m[1][1] - F->m[1][0] * F->m[0][1] > 0 )
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        turn = 1;
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        turn = -1;
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_epipole[0] < 0 )
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 0;
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( l_epipole[0] < width )
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 1;
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 2;
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_epipole[1] < 0 )
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j = 2;
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( l_epipole[1] < height )
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j = 1;
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j = 0;
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[0] = Region[j][i][0];
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[1] = Region[j][i][1];
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[2] = Region[j][i][2];
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[3] = Region[j][i][3];
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( r_epipole[0] < 0 )
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 0;
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( r_epipole[0] < width )
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 1;
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 2;
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( r_epipole[1] < 0 )
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j = 2;
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( r_epipole[1] < height )
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j = 1;
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j = 0;
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[0] = Region[j][i][0];
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[1] = Region[j][i][1];
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[2] = Region[j][i][2];
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[3] = Region[j][i][3];
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius1 = l_epipole[0] * l_epipole[0] + (l_epipole[1] - height) * (l_epipole[1] - height);
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius2 = (l_epipole[0] - width) * (l_epipole[0] - width) +
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (l_epipole[1] - height) * (l_epipole[1] - height);
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius3 = l_epipole[0] * l_epipole[0] + l_epipole[1] * l_epipole[1];
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius4 = (l_epipole[0] - width) * (l_epipole[0] - width) + l_epipole[1] * l_epipole[1];
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_radius = (float) sqrt( (double)MAX( MAX( radius1, radius2 ), MAX( radius3, radius4 )));
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius1 = r_epipole[0] * r_epipole[0] + (r_epipole[1] - height) * (r_epipole[1] - height);
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius2 = (r_epipole[0] - width) * (r_epipole[0] - width) +
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (r_epipole[1] - height) * (r_epipole[1] - height);
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius3 = r_epipole[0] * r_epipole[0] + r_epipole[1] * r_epipole[1];
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    radius4 = (r_epipole[0] - width) * (r_epipole[0] - width) + r_epipole[1] * r_epipole[1];
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_radius = (float) sqrt( (double)MAX( MAX( radius1, radius2 ), MAX( radius3, radius4 )));
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_start_end[0] == 2 && r_start_end[0] == 2 )
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_radius > r_radius )
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_angle[0] = 0.0f;
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_angle[1] = (float) CV_PI;
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvBuildScanlineLeftStereo( imgSize,
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                matrix,
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                l_epipole,
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                l_angle,
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                l_radius, scanlines_1, scanlines_2, numlines );
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return error;
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_angle[0] = 0.0f;
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_angle[1] = (float) CV_PI;
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            error = icvBuildScanlineRightStereo( imgSize,
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 matrix,
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 r_epipole,
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 r_angle,
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 r_radius,
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 scanlines_1, scanlines_2, numlines );
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return error;
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_start_end[0] == 2 )
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[0] = (float) atan2( r_start_end[1] * height - r_epipole[1],
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    r_start_end[0] * width - r_epipole[0] );
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[1] = (float) atan2( r_start_end[3] * height - r_epipole[1],
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    r_start_end[2] * width - r_epipole[0] );
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( r_angle[0] > r_angle[1] )
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_angle[1] += (float) (CV_PI * 2);
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanlineRightStereo( imgSize,
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             matrix,
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             r_epipole,
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             r_angle,
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             r_radius, scanlines_1, scanlines_2, numlines );
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return error;
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( r_start_end[0] == 2 )
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[0] = l_start_end[0] * width;
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[1] = l_start_end[1] * height;
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[2] = 1;
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixTVector3( F, l_point, r_epiline );
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[0] = (float) atan2( l_start_end[1] * height - l_epipole[1],
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    l_start_end[0] * width - l_epipole[0] );
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[1] = (float) atan2( l_start_end[3] * height - l_epipole[1],
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    l_start_end[2] * width - l_epipole[0] );
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( l_angle[0] > l_angle[1] )
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_angle[1] += (float) (CV_PI * 2);
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanlineLeftStereo( imgSize,
15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            matrix,
15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            l_epipole,
15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            l_angle,
15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            l_radius, scanlines_1, scanlines_2, numlines );
15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return error;
15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[0] *= width;
15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[1] *= height;
15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[2] *= width;
15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_start_end[3] *= height;
15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[0] *= width;
15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[1] *= height;
15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[2] *= width;
15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_start_end[3] *= height;
15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = r_start_end[0];
15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = r_start_end[1];
15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, l_epiline );
15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvBuildScanline( imgSize, l_epiline, 0, &x, 0, &y );
15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( error == CV_NO_ERR )
15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[0] = (float) atan2( y - l_epipole[1], x - l_epipole[0] );
15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[0] = (float) atan2( r_point[1] - r_epipole[1], r_point[0] - r_epipole[0] );
15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( turn == 1 )
15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = l_start_end[0];
15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = l_start_end[1];
16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = l_start_end[2];
16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = l_start_end[3];
16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[2] = 1;
16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixTVector3( F, l_point, r_epiline );
16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanline( imgSize, r_epiline, 0, &x, 0, &y );
16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( error == CV_NO_ERR )
16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_angle[0] = (float) atan2( y - r_epipole[1], x - r_epipole[0] );
16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_angle[0] = (float) atan2( l_point[1] - l_epipole[1], l_point[0] - l_epipole[0] );
16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_BADFACTOR_ERR;
16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[0] = r_start_end[2];
16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[1] = r_start_end[3];
16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMultMatrixVector3( F, r_point, l_epiline );
16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    error = icvBuildScanline( imgSize, l_epiline, 0, &x, 0, &y );
16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( error == CV_NO_ERR )
16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[1] = (float) atan2( y - l_epipole[1], x - l_epipole[0] );
16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[1] = (float) atan2( r_point[1] - r_epipole[1], r_point[0] - r_epipole[0] );
16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( turn == 1 )
16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = l_start_end[2];
16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = l_start_end[3];
16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[0] = l_start_end[0];
16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_point[1] = l_start_end[1];
16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[2] = 1;
16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixTVector3( F, l_point, r_epiline );
16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanline( imgSize, r_epiline, 0, &x, 0, &y );
16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( error == CV_NO_ERR )
16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_angle[1] = (float) atan2( y - r_epipole[1], x - r_epipole[0] );
16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_angle[1] = (float) atan2( l_point[1] - l_epipole[1], l_point[0] - l_epipole[0] );
16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_BADFACTOR_ERR;
16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_angle[0] > l_angle[1] )
16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        swap = l_angle[0];
16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[0] = l_angle[1];
16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[1] = swap;
16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_angle[1] - l_angle[0] > CV_PI )
16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        swap = l_angle[0];
16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[0] = l_angle[1];
16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_angle[1] = swap + (float) (CV_PI * 2);
16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( r_angle[0] > r_angle[1] )
16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        swap = r_angle[0];
16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[0] = r_angle[1];
16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[1] = swap;
16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( r_angle[1] - r_angle[0] > CV_PI )
17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        swap = r_angle[0];
17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[0] = r_angle[1];
17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_angle[1] = swap + (float) (CV_PI * 2);
17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( l_radius * (l_angle[1] - l_angle[0]) > r_radius * (r_angle[1] - r_angle[0]) )
17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanlineLeftStereo( imgSize,
17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            matrix,
17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            l_epipole,
17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            l_angle,
17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            l_radius, scanlines_1, scanlines_2, numlines );
17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvBuildScanlineRightStereo( imgSize,
17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             matrix,
17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             r_epipole,
17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             r_angle,
17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             r_radius, scanlines_1, scanlines_2, numlines );
17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvGetCoefficientStereo */
17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBuildScanlineLeftStereo( CvSize imgSize,
17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            CvMatrix3 * matrix,
17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            float *l_epipole,
17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            float *l_angle,
17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            float l_radius, int *scanlines_1, int *scanlines_2, int *numlines )
17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //int prewarp_width;
17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int prewarp_height;
17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float i;
17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int offset;
17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float height;
17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta;
17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float angle;
17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_point[3];
17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_epiline[3];
17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_epiline[3];
17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( l_angle != 0 && !REAL_ZERO( l_radius ));
17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*prewarp_width = (int) (sqrt( image_width * image_width +
17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 image_height * image_height ) + 1);*/
17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    prewarp_height = (int) (l_radius * (l_angle[1] - l_angle[0]));
17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( scanlines_1 == 0 && scanlines_2 == 0 )
17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NO_ERR;
17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_point[2] = 1;
17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) prewarp_height;
17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta = (l_angle[1] - l_angle[0]) / height;
17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_angle[0] += delta;
17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l_angle[1] -= delta;
17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta = (l_angle[1] - l_angle[0]) / height;
17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0, offset = 0; i < height; i++, offset += 4 )
17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        angle = l_angle[0] + i * delta;
17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[0] = l_epipole[0] + l_radius * (float) cos( angle );
17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_point[1] = l_epipole[1] + l_radius * (float) sin( angle );
17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixTVector3( F, l_point, r_epiline );
17816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, r_epiline,
17836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset,
17846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 1,
17856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 2, scanlines_2 + offset + 3 );
17866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_epiline[0] = l_point[1] - l_epipole[1];
17896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_epiline[1] = l_epipole[0] - l_point[0];
17906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l_epiline[2] = l_point[0] * l_epipole[1] - l_point[1] * l_epipole[0];
17916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( Sgn( l_epiline[0] * r_epiline[0] + l_epiline[1] * r_epiline[1] ) < 0 )
17936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_epiline[0] = -l_epiline[0];
17966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_epiline[1] = -l_epiline[1];
17976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l_epiline[2] = -l_epiline[2];
17986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
17996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, l_epiline,
18016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset,
18026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 1,
18036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 2, scanlines_1 + offset + 3 );
18046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* for */
18066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
18086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
18106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlBuildScanlineLeftStereo */
18126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
18146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
18156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBuildScanlineRightStereo( CvSize imgSize,
18166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             CvMatrix3 * matrix,
18176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             float *r_epipole,
18186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             float *r_angle,
18196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             float r_radius,
18206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             int *scanlines_1, int *scanlines_2, int *numlines )
18216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //int prewarp_width;
18236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int prewarp_height;
18246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float i;
18256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int offset;
18266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float height;
18276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float delta;
18286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float angle;
18296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_point[3];
18306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float l_epiline[3];
18316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float r_epiline[3];
18326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus error = CV_OK;
18336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatrix3 *F;
18346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( r_angle != 0 && !REAL_ZERO( r_radius ));
18366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*prewarp_width = (int) (sqrt( image_width * image_width +
18386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 image_height * image_height ) + 1);*/
18396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    prewarp_height = (int) (r_radius * (r_angle[1] - r_angle[0]));
18416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
18436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( scanlines_1 == 0 && scanlines_2 == 0 )
18456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NO_ERR;
18466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    F = matrix;
18486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_point[2] = 1;
18506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) prewarp_height;
18516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta = (r_angle[1] - r_angle[0]) / height;
18536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_angle[0] += delta;
18556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r_angle[1] -= delta;
18566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    delta = (r_angle[1] - r_angle[0]) / height;
18586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0, offset = 0; i < height; i++, offset += 4 )
18606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        angle = r_angle[0] + i * delta;
18636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[0] = r_epipole[0] + r_radius * (float) cos( angle );
18656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_point[1] = r_epipole[1] + r_radius * (float) sin( angle );
18666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvMultMatrixVector3( F, r_point, l_epiline );
18686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, l_epiline,
18706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset,
18716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 1,
18726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_1 + offset + 2, scanlines_1 + offset + 3 );
18736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( error == CV_NO_ERR );
18756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_epiline[0] = r_point[1] - r_epipole[1];
18776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_epiline[1] = r_epipole[0] - r_point[0];
18786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        r_epiline[2] = r_point[0] * r_epipole[1] - r_point[1] * r_epipole[0];
18796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( Sgn( l_epiline[0] * r_epiline[0] + l_epiline[1] * r_epiline[1] ) < 0 )
18816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_epiline[0] = -r_epiline[0];
18846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_epiline[1] = -r_epiline[1];
18856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r_epiline[2] = -r_epiline[2];
18866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* if */
18876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        error = icvGetCrossEpilineFrame( imgSize, r_epiline,
18896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset,
18906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 1,
18916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         scanlines_2 + offset + 2, scanlines_2 + offset + 3 );
18926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( error == CV_NO_ERR );
18946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* for */
18956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *numlines = prewarp_height;
18976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return error;
18996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlBuildScanlineRightStereo */
19016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*===========================================================================*/
19036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus
19046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetCrossEpilineFrame( CvSize imgSize, float *epiline, int *x1, int *y1, int *x2, int *y2 )
19056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
19066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int tx, ty;
19076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float point[2][2];
19086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sign[4], i;
19096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float width, height;
19106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double tmpvalue;
19116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( REAL_ZERO( epiline[0] ) && REAL_ZERO( epiline[1] ))
19136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
19146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    width = (float) imgSize.width - 1;
19166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    height = (float) imgSize.height - 1;
19176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tmpvalue = epiline[2];
19196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[0] = SIGN( tmpvalue );
19206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tmpvalue = epiline[0] * width + epiline[2];
19226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[1] = SIGN( tmpvalue );
19236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tmpvalue = epiline[1] * height + epiline[2];
19256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[2] = SIGN( tmpvalue );
19266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tmpvalue = epiline[0] * width + epiline[1] * height + epiline[2];
19286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sign[3] = SIGN( tmpvalue );
19296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    i = 0;
19316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( tx = 0; tx < 2; tx++ )
19326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ty = 0; ty < 2; ty++ )
19346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( sign[ty * 2 + tx] == 0 )
19376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                point[i][0] = width * tx;
19406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                point[i][1] = height * ty;
19416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                i++;
19426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                   /* if */
19446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* for */
19456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* for */
19466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[0] * sign[1] < 0 )
19486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = -epiline[2] / epiline[0];
19506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = 0;
19516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i++;
19526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
19536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[0] * sign[2] < 0 )
19556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = 0;
19576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = -epiline[2] / epiline[1];
19586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i++;
19596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
19606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[1] * sign[3] < 0 )
19626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = width;
19646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = -(epiline[0] * width + epiline[2]) / epiline[1];
19656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i++;
19666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
19676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[2] * sign[3] < 0 )
19696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][0] = -(epiline[1] * height + epiline[2]) / epiline[0];
19716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        point[i][1] = height;
19726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
19736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sign[0] == sign[1] && sign[0] == sign[2] && sign[0] == sign[3] )
19756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
19766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (point[0][0] - point[1][0]) * epiline[1] +
19786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (point[1][1] - point[0][1]) * epiline[0] > 0 )
19796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *x1 = (int) point[0][0];
19816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *y1 = (int) point[0][1];
19826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *x2 = (int) point[1][0];
19836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *y2 = (int) point[1][1];
19846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
19866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *x1 = (int) point[1][0];
19886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *y1 = (int) point[1][1];
19896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *x2 = (int) point[0][0];
19906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *y2 = (int) point[0][1];
19916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* if */
19926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
19946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                               /* icvlGetCrossEpilineFrame */
19956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*=====================================================================================*/
19976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
19996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMakeScanlines( const CvMatrix3* matrix, CvSize imgSize,
20006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                 int *scanlines_1, int *scanlines_2,
20016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                 int *lens_1, int *lens_2, int *numlines )
20026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
20036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvMakeScanlines" );
20046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
20066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( icvMakeScanlines( (CvMatrix3*)matrix, imgSize, scanlines_1,
20086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 scanlines_2, lens_1, lens_2, numlines ));
20096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
20106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
20116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F///////////////////////////////////////////////////////////////////////////////////////
20136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Name: cvDeleteMoire
20146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Purpose: The functions
20156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Context:
20166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Parameters:
20176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
20186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Notes:
20196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/
20206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
20216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMakeAlphaScanlines( int *scanlines_1,
20226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int *scanlines_2,
20236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int *scanlines_a, int *lens, int numlines, float alpha )
20246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
20256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvMakeAlphaScanlines" );
20266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
20286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( icvMakeAlphaScanlines( scanlines_1, scanlines_2, scanlines_a,
20306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      lens, numlines, alpha ));
20316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
20336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2034