コード例 #1
0
CvSubdiv2D* init_delaunay( CvMemStorage* storage,
                           CvRect rect )
{
    CvSubdiv2D* subdiv;

    subdiv = cvCreateSubdiv2D( CV_SEQ_KIND_SUBDIV2D, sizeof(*subdiv),
                               sizeof(CvSubdiv2DPoint),
                               sizeof(CvQuadEdge2D),
                               storage );
    cvInitSubdivDelaunay2D( subdiv, rect );

    return subdiv;
}
コード例 #2
0
ファイル: decomppoly.cpp プロジェクト: 93sam/opencv
void cvDecompPoly( CvContour* cont,
                      CvSubdiv2D** subdiv,
                      CvMemStorage* storage )
{
    int*    memory;
    CvPoint*    contour;
    int*        outEdges;
    int*        refer;
    CvSubdiv2DPoint**   pntsPtrs;
    CvQuadEdge2D**      edgesPtrs;
    int numVtx;
    int numEdges;
    int i;
    CvSeqReader reader;
    CvPoint2D32f pnt;
    CvQuadEdge2D* quadEdge;

    numVtx = cont -> total;
    if( numVtx < 3 ) {
        return;
    }

    *subdiv = ( CvSubdiv2D* )0;

    memory = ( int* )malloc( sizeof( int ) * ( numVtx * 2
        + numVtx * numVtx * 2 * 5 )
        + sizeof( CvQuadEdge2D* ) * ( numVtx * numVtx )
        + sizeof( CvSubdiv2DPoint* ) * ( numVtx * 2 ) );
    contour     = ( CvPoint* )memory;
    outEdges    = ( int* )( contour + numVtx );
    refer       = outEdges + numVtx * numVtx * 2;
    edgesPtrs   = ( CvQuadEdge2D** )( refer + numVtx * numVtx * 4 );
    pntsPtrs    = ( CvSubdiv2DPoint** )( edgesPtrs + numVtx * numVtx );

    cvStartReadSeq( ( CvSeq* )cont, &reader, 0 );
    for( i = 0; i < numVtx; i ++ )
    {
        CV_READ_SEQ_ELEM( (contour[ i ]), reader );
    } // for( i = 0; i < numVtx; i ++ )

    if( !icvFindReferences( contour, numVtx, outEdges, refer, &numEdges ) )
    {
        free( memory );
        return;
    } // if( !icvFindReferences( contour, numVtx, outEdges, refer, ...

    *subdiv = cvCreateSubdiv2D( CV_SEQ_KIND_SUBDIV2D,
                                sizeof( CvSubdiv2D ),
                                sizeof( CvSubdiv2DPoint ),
                                sizeof( CvQuadEdge2D ),
                                storage );

    for( i = 0; i < numVtx; i ++ )
    {
        pnt.x = ( float )contour[ i ].x;
        pnt.y = ( float )contour[ i ].y;
        pntsPtrs[ i ] = cvSubdiv2DAddPoint( *subdiv, pnt, 0 );
    } // for( i = 0; i < numVtx; i ++ )

    for( i = 0; i < numEdges; i ++ )
    {
        edgesPtrs[ i ] = ( CvQuadEdge2D* )
            ( cvSubdiv2DMakeEdge( *subdiv ) & 0xfffffffc );
    } // for( i = 0; i < numEdges; i ++ )

    for( i = 0; i < numEdges; i ++ )
    {
        quadEdge = edgesPtrs[ i ];
        quadEdge -> next[ 0 ] =
            ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4     ] >> 2 ] )
            | ( refer[ i * 4     ] & 3 );
        quadEdge -> next[ 1 ] =
            ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 + 1 ] >> 2 ] )
            | ( refer[ i * 4 + 1 ] & 3 );
        quadEdge -> next[ 2 ] =
            ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 + 2 ] >> 2 ] )
            | ( refer[ i * 4 + 2 ] & 3 );
        quadEdge -> next[ 3 ] =
            ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 + 3 ] >> 2 ] )
            | ( refer[ i * 4 + 3 ] & 3 );
        quadEdge -> pt[ 0 ] = pntsPtrs[ outEdges[ i * 2     ] ];
        quadEdge -> pt[ 1 ] = ( CvSubdiv2DPoint* )0;
        quadEdge -> pt[ 2 ] = pntsPtrs[ outEdges[ i * 2 + 1 ] ];
        quadEdge -> pt[ 3 ] = ( CvSubdiv2DPoint* )0;
    } // for( i = 0; i < numEdges; i ++ )

    (*subdiv) -> topleft.x = ( float )cont -> rect.x;
    (*subdiv) -> topleft.y = ( float )cont -> rect.y;
    (*subdiv) -> bottomright.x =
        ( float )( cont -> rect.x + cont -> rect.width );
    (*subdiv) -> bottomright.y =
        ( float )( cont -> rect.y + cont -> rect.height );

    free( memory );
    return;

} // cvDecompPoly