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 Renn#ifdef WIN32 /* make sure it builds under Linux whenever it is included into Makefile.am or not. */ 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//void icvCutContour( CvSeq* current, IplImage* image ); 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeq* icvCutContourRaster( CvSeq* current, CvMemStorage* storage, IplImage* image ); 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//create lists of segments of all contours from image 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeq* cvExtractSingleEdges( IplImage* image, //bw image - it's content will be destroyed by cvFindContours 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* storage ) 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* tmp_storage = cvCreateChildMemStorage( storage ); 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* contours = 0; 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFindContours( image, tmp_storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE ); 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvZero( image ); 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //iterate through contours 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //iterate through tree 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* current = contours; 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int number = 0; 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int level = 1; 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* output = 0; 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* tail_seq = 0; 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //actually this loop can iterates through tree, 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //but still we use CV_RETR_LIST it is not useful 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( current ) 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn number++; 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //get vertical list of segments for one contour 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* new_seq = icvCutContourRaster( current, storage, image ); 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //add this vertical list to horisontal list 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( new_seq ) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( tail_seq ) 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tail_seq->h_next = new_seq; 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn new_seq->h_prev = tail_seq; 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tail_seq = new_seq; 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn output = tail_seq = new_seq; 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //iteration through tree 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( current->v_next ) 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //goto child 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn current = current->v_next; 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn level++; 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //go parent 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( !current->h_next ) 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn current = current->v_prev; 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn level--; 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !level ) break; 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( current ) //go brother 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn current = current->h_next; 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //free temporary memstorage with initial contours 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMemStorage( &tmp_storage ); 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return output; 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//makes vertical list of segments for 1 contour 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeq* icvCutContourRaster( CvSeq* current, CvMemStorage* storage, IplImage* image /*tmp image*/) 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //iplSet(image, 0 ); // this can cause double edges if two contours have common edge 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // for example if object is circle with 1 pixel width 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // to remove such problem - remove this iplSet 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //approx contour by single edges 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeqReader reader; 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeqWriter writer; 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int writing = 0; 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvStartReadSeq( current, &reader, 0 ); 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //below line just to avoid warning 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvStartWriteSeq( current->flags, sizeof(CvContour), sizeof(CvPoint), storage, &writer ); 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* output = 0; 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* tail = 0; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //first pass through contour - compute number of branches at every point 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < current->total; i++ ) 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint cur; 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_READ_SEQ_ELEM( cur, reader ); 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //mark point 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uchar*)image->imageData)[image->widthStep * cur.y + cur.x]++; 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( ((uchar*)image->imageData)[image->widthStep * cur.y + cur.x] != 255 ); 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //second pass - create separate edges 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < current->total; i++ ) 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint cur; 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_READ_SEQ_ELEM( cur, reader ); 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //get pixel at this point 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar flag = image->imageData[image->widthStep * cur.y + cur.x]; 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( flag != 255 && flag < 3) // 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(!writing) 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvStartWriteSeq( current->flags, sizeof(CvContour), sizeof(CvPoint), storage, &writer ); 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn writing = 1 ; 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //mark point 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( flag < 3 ) ((uchar*)image->imageData)[image->widthStep * cur.y + cur.x] = 255; 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //add it to another seq 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_WRITE_SEQ_ELEM( cur, writer ); 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //exclude this point from contour 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( writing ) 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* newseq = cvEndWriteSeq( &writer ); 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn writing = 0; 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( tail ) 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tail->v_next = newseq; 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn newseq->v_prev = tail; 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tail = newseq; 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn output = tail = newseq; 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( writing ) //if were not self intersections 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* newseq = cvEndWriteSeq( &writer ); 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn writing = 0; 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( tail ) 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tail->v_next = newseq; 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn newseq->v_prev = tail; 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tail = newseq; 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn output = tail = newseq; 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return output; 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*void icvCutContour( CvSeq* current, IplImage* image ) 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //approx contour by single edges 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeqReader reader; 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeqReader rev_reader; 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvStartReadSeq( current, &reader, 0 ); 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int64* cur_pt = (int64*)reader.ptr; 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int64* prev_pt = (int64*)reader.prev_elem; 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //search for point a in aba position 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < current->total; i++ ) 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_NEXT_SEQ_ELEM( sizeof(int64), reader ); 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //compare current reader pos element with old previous 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( prev_pt[0] == ((int64*)reader.ptr)[0] ) 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //return to prev pos 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_PREV_SEQ_ELEM( sizeof(int64), reader ); 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //this point is end of edge 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //start going both directions and collect edge 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvStartReadSeq( current, &rev_reader, 1 ); 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pos = cvGetSeqReaderPos( &reader ); 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvSetSeqReaderPos( &rev_reader, pos ); 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //walk in both directions 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while(1); 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int64* cur_pt = (int64*)reader.ptr; 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int64* prev_pt = (int64*)reader.prev_elem; 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/ 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /* WIN32 */ 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 269