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