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 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cvaux.h" 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSubdiv2DCheck( CvSubdiv2D* subdiv ) 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, total = subdiv->edges->total; 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int check_result = 0; 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME("icvSubdiv2DCheck"); 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !subdiv ) 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR_FROM_STATUS( CV_NULLPTR_ERR ); 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < total; i++ ) 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvQuadEdge2D* edge = (CvQuadEdge2D*)cvGetSetElem(subdiv->edges,i); 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( edge && CV_IS_SET_ELEM( edge )) 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < 4; j++ ) 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge e = (CvSubdiv2DEdge)edge + j; 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge o_next = cvSubdiv2DNextEdge(e); 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge o_prev = cvSubdiv2DGetEdge(e, CV_PREV_AROUND_ORG ); 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge d_prev = cvSubdiv2DGetEdge(e, CV_PREV_AROUND_DST ); 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge d_next = cvSubdiv2DGetEdge(e, CV_NEXT_AROUND_DST ); 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // check points 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DEdgeOrg(e) != cvSubdiv2DEdgeOrg(o_next)) 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DEdgeOrg(e) != cvSubdiv2DEdgeOrg(o_prev)) 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DEdgeDst(e) != cvSubdiv2DEdgeDst(d_next)) 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DEdgeDst(e) != cvSubdiv2DEdgeDst(d_prev)) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( j % 2 == 0 ) 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DEdgeDst(o_next) != cvSubdiv2DEdgeOrg(d_prev)) 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DEdgeDst(o_prev) != cvSubdiv2DEdgeOrg(d_next)) 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DGetEdge(cvSubdiv2DGetEdge(cvSubdiv2DGetEdge( 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e,CV_NEXT_AROUND_LEFT),CV_NEXT_AROUND_LEFT),CV_NEXT_AROUND_LEFT) != e ) 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvSubdiv2DGetEdge(cvSubdiv2DGetEdge(cvSubdiv2DGetEdge( 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e,CV_NEXT_AROUND_RIGHT),CV_NEXT_AROUND_RIGHT),CV_NEXT_AROUND_RIGHT) != e) 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn check_result = 1; 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return check_result; 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndraw_subdiv_facet( CvSubdiv2D * subdiv, IplImage * dst, IplImage * src, CvSubdiv2DEdge edge ) 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge t = edge; 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, count = 0; 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint local_buf[100]; 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint *buf = local_buf; 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // count number of edges in facet 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn count++; 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT ); 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( t != edge && count < subdiv->quad_edges * 4 ); 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( count * sizeof( buf[0] ) > sizeof( local_buf )) 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf = (CvPoint *) malloc( count * sizeof( buf[0] )); 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // gather points 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = edge; 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < count; i++ ) 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DPoint *pt = cvSubdiv2DEdgeOrg( t ); 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !pt ) 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( fabs( pt->pt.x ) < 10000 && fabs( pt->pt.y ) < 10000 ); 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[i] = cvPoint( cvRound( pt->pt.x ), cvRound( pt->pt.y )); 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT ); 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( i == count ) 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DPoint *pt = cvSubdiv2DEdgeDst( cvSubdiv2DRotateEdge( edge, 1 )); 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint ip = cvPoint( cvRound( pt->pt.x ), cvRound( pt->pt.y )); 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvScalar color = {{0,0,0,0}}; 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //printf("count = %d, (%d,%d)\n", ip.x, ip.y ); 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( 0 <= ip.x && ip.x < src->width && 0 <= ip.y && ip.y < src->height ) 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *ptr = (uchar*)(src->imageData + ip.y * src->widthStep + ip.x * 3); 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn color = CV_RGB( ptr[2], ptr[1], ptr[0] ); 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFillConvexPoly( dst, buf, count, color ); 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //draw_subdiv_point( dst, pt->pt, CV_RGB(0,0,0)); 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( buf != local_buf ) 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn free( buf ); 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvDrawMosaic( CvSubdiv2D * subdiv, IplImage * src, IplImage * dst ) 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, total = subdiv->edges->total; 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvCalcSubdivVoronoi2D( subdiv ); 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //icvSet( dst, 255 ); 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < total; i++ ) 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvQuadEdge2D *edge = (CvQuadEdge2D *) cvGetSetElem( subdiv->edges, i ); 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( edge && CV_IS_SET_ELEM( edge )) 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSubdiv2DEdge e = (CvSubdiv2DEdge) edge; 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // left 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn draw_subdiv_facet( subdiv, dst, src, cvSubdiv2DRotateEdge( e, 1 )); 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // right 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn draw_subdiv_facet( subdiv, dst, src, cvSubdiv2DRotateEdge( e, 3 )); 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 188