void paint_voronoi( CvSubdiv2D* subdiv, IplImage* img ) { CvSeqReader reader; int i, total = subdiv->edges->total; int elem_size = subdiv->edges->elem_size; cvCalcSubdivVoronoi2D( subdiv ); cvStartReadSeq( (CvSeq*)(subdiv->edges), &reader, 0 ); for( i = 0; i < total; i++ ) { CvQuadEdge2D* edge = (CvQuadEdge2D*)(reader.ptr); if( CV_IS_SET_ELEM( edge )) { CvSubdiv2DEdge e = (CvSubdiv2DEdge)edge; // left draw_subdiv_facet( img, cvSubdiv2DRotateEdge( e, 1 )); // right draw_subdiv_facet( img, cvSubdiv2DRotateEdge( e, 3 )); } CV_NEXT_SEQ_ELEM( elem_size, reader ); } }
void PlanarSubdivisionGetSubdiv2DPoints(CvSubdiv2D* subdiv, CvPoint2D32f* points, CvSubdiv2DEdge* edges, int* pointCount) { UniquePointSet pointSet; CvSet* subdivEdges = subdiv->edges; CvPoint2D32f* currentPoint = points; CvSubdiv2DEdge* currentEdge = edges; CvSeqReader reader; cvStartReadSeq((CvSeq*) subdivEdges, &reader); schar* start = reader.ptr; while(CV_IS_SET_ELEM(reader.ptr)) { CvQuadEdge2D* qEdge = (CvQuadEdge2D*)reader.ptr; if (qEdge && CV_IS_SET_ELEM(qEdge)) { CvSubdiv2DEdge e = (CvSubdiv2DEdge) qEdge; if (e && CV_IS_SET_ELEM(e)) { CvSubdiv2DPoint* p1 = cvSubdiv2DEdgeOrg(e); if (p1 && pointSet.insert(p1->pt).second && PointInRegion(p1->pt, subdiv)) { *currentPoint++ = p1->pt; *currentEdge++ = cvSubdiv2DRotateEdge(e, 1); } CvSubdiv2DPoint* p2 = cvSubdiv2DEdgeDst(e); if(p2 && pointSet.insert(p2->pt).second && PointInRegion(p2->pt, subdiv)) { *currentPoint++ = p2->pt; *currentEdge++ = cvSubdiv2DRotateEdge(e, 3); } } } CV_NEXT_SEQ_ELEM(subdivEdges->elem_size, reader); // prevent infinite loop if(reader.ptr == start) break; } *pointCount = currentPoint - points; }
static void cvSubdiv2DSplice( CvSubdiv2DEdge edgeA, CvSubdiv2DEdge edgeB ) { CvSubdiv2DEdge *a_next = &CV_SUBDIV2D_NEXT_EDGE( edgeA ); CvSubdiv2DEdge *b_next = &CV_SUBDIV2D_NEXT_EDGE( edgeB ); CvSubdiv2DEdge a_rot = cvSubdiv2DRotateEdge( *a_next, 1 ); CvSubdiv2DEdge b_rot = cvSubdiv2DRotateEdge( *b_next, 1 ); CvSubdiv2DEdge *a_rot_next = &CV_SUBDIV2D_NEXT_EDGE( a_rot ); CvSubdiv2DEdge *b_rot_next = &CV_SUBDIV2D_NEXT_EDGE( b_rot ); CvSubdiv2DEdge t; CV_SWAP( *a_next, *b_next, t ); CV_SWAP( *a_rot_next, *b_rot_next, t ); }
void draw_subdiv_facet( IplImage* img, CvSubdiv2DEdge edge ) { CvSubdiv2DEdge t = edge; int i, count = 0; CvPoint* buf = 0; // count number of edges in facet do { count++; t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT ); } while (t != edge ); buf = (CvPoint*)malloc( count * sizeof(buf[0])); // gather points t = edge; for( i = 0; i < count; i++ ) { CvSubdiv2DPoint* pt = cvSubdiv2DEdgeOrg( t ); if( !pt ) break; buf[i] = cvPoint( cvRound(pt->pt.x), cvRound(pt->pt.y)); t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT ); } if( i == count ) { CvSubdiv2DPoint* pt = cvSubdiv2DEdgeDst( cvSubdiv2DRotateEdge( edge, 1 )); cvFillConvexPoly( img, buf, count, CV_RGB(rand()&255,rand()&255,rand()&255), CV_AA, 0 ); cvPolyLine( img, &buf, &count, 1, 1, CV_RGB(0,0,0), 1, CV_AA, 0); draw_subdiv_point( img, pt->pt, CV_RGB(0,0,0)); } free( buf ); }
static void draw_subdiv_facet( CvSubdiv2D * subdiv, IplImage * dst, IplImage * src, CvSubdiv2DEdge edge ) { CvSubdiv2DEdge t = edge; int i, count = 0; CvPoint local_buf[100]; CvPoint *buf = local_buf; // count number of edges in facet do { count++; t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT ); } while( t != edge && count < subdiv->quad_edges * 4 ); if( count * sizeof( buf[0] ) > sizeof( local_buf )) { buf = (CvPoint *) malloc( count * sizeof( buf[0] )); } // gather points t = edge; for( i = 0; i < count; i++ ) { CvSubdiv2DPoint *pt = cvSubdiv2DEdgeOrg( t ); if( !pt ) break; assert( fabs( pt->pt.x ) < 10000 && fabs( pt->pt.y ) < 10000 ); buf[i] = cvPoint( cvRound( pt->pt.x ), cvRound( pt->pt.y )); t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT ); } if( i == count ) { CvSubdiv2DPoint *pt = cvSubdiv2DEdgeDst( cvSubdiv2DRotateEdge( edge, 1 )); CvPoint ip = cvPoint( cvRound( pt->pt.x ), cvRound( pt->pt.y )); CvScalar color = {{0,0,0,0}}; //printf("count = %d, (%d,%d)\n", ip.x, ip.y ); if( 0 <= ip.x && ip.x < src->width && 0 <= ip.y && ip.y < src->height ) { uchar *ptr = (uchar*)(src->imageData + ip.y * src->widthStep + ip.x * 3); color = CV_RGB( ptr[2], ptr[1], ptr[0] ); } cvFillConvexPoly( dst, buf, count, color ); //draw_subdiv_point( dst, pt->pt, CV_RGB(0,0,0)); } if( buf != local_buf ) free( buf ); }
CV_IMPL void icvDrawMosaic( CvSubdiv2D * subdiv, IplImage * src, IplImage * dst ) { int i, total = subdiv->edges->total; cvCalcSubdivVoronoi2D( subdiv ); //icvSet( dst, 255 ); for( i = 0; i < total; i++ ) { CvQuadEdge2D *edge = (CvQuadEdge2D *) cvGetSetElem( subdiv->edges, i ); if( edge && CV_IS_SET_ELEM( edge )) { CvSubdiv2DEdge e = (CvSubdiv2DEdge) edge; // left draw_subdiv_facet( subdiv, dst, src, cvSubdiv2DRotateEdge( e, 1 )); // right draw_subdiv_facet( subdiv, dst, src, cvSubdiv2DRotateEdge( e, 3 )); } } }
CV_IMPL CvSubdiv2DPoint* cvFindNearestPoint2D( CvSubdiv2D* subdiv, CvPoint2D32f pt ) { CvSubdiv2DPoint* point = 0; CvPoint2D32f start; CvPoint2D32f diff; CvSubdiv2DPointLocation loc; CvSubdiv2DEdge edge; int i; if( !subdiv ) CV_Error( CV_StsNullPtr, "" ); if( !CV_IS_SUBDIV2D( subdiv )) CV_Error( CV_StsNullPtr, "" ); if( subdiv->edges->active_count <= 3 ) return 0; if( !subdiv->is_geometry_valid ) cvCalcSubdivVoronoi2D( subdiv ); loc = cvSubdiv2DLocate( subdiv, pt, &edge, &point ); switch( loc ) { case CV_PTLOC_ON_EDGE: case CV_PTLOC_INSIDE: break; default: return point; } point = 0; start = cvSubdiv2DEdgeOrg( edge )->pt; diff.x = pt.x - start.x; diff.y = pt.y - start.y; edge = cvSubdiv2DRotateEdge( edge, 1 ); for( i = 0; i < subdiv->total; i++ ) { CvPoint2D32f t; for(;;) { assert( cvSubdiv2DEdgeDst( edge )); t = cvSubdiv2DEdgeDst( edge )->pt; if( icvIsRightOf2( t, start, diff ) >= 0 ) break; edge = cvSubdiv2DGetEdge( edge, CV_NEXT_AROUND_LEFT ); } for(;;) { assert( cvSubdiv2DEdgeOrg( edge )); t = cvSubdiv2DEdgeOrg( edge )->pt; if( icvIsRightOf2( t, start, diff ) < 0 ) break; edge = cvSubdiv2DGetEdge( edge, CV_PREV_AROUND_LEFT ); } { CvPoint2D32f tempDiff = cvSubdiv2DEdgeDst( edge )->pt; t = cvSubdiv2DEdgeOrg( edge )->pt; tempDiff.x -= t.x; tempDiff.y -= t.y; if( icvIsRightOf2( pt, t, tempDiff ) >= 0 ) { point = cvSubdiv2DEdgeOrg( cvSubdiv2DRotateEdge( edge, 3 )); break; } } edge = cvSubdiv2DSymEdge( edge ); } return point; }