2

Ubuntu 11.04 で NetBeans 7.1 を使用しており、OpenCV を使用して一連の点から三角形を取得したいと考えています。次のように Delaunay 三角形分割を作成します。

CvMemStorage *storage;
size_t      ptIndex;
CvSubdiv2D* subdiv;

storage = cvCreateMemStorage(0);
subdiv =  cvCreateSubdivDelaunay2D( boundRect, storage );
for (ptIndex = 0; ptIndex<numPts; ptIndex++)
    cvSubdivDelaunay2DInsert(subdiv, points[ptIndex]);

その部分はうまくいくようです。実行すると、結果のストレージは次のようになります。

ストレージ 0xb287a90
署名 1116274688
下部 0x2a2d57a0
前 0x0 次 0x2a2e5730
上部 0x2cc947d0
前 0x2cc84840
次 0x0 親 0x0 署名
下部
上部

block_size
free_space
block_size 65408
free_space 0

ここでこれらの関数のドキュメントを見ましたが、三角形を抽出する関数が見つかりません。

誰かが三角形を抽出する方法を教えてくれたら、とてもありがたいです。

ピーター。

4

1 に答える 1

1

次のようにエッジを反復できます。

CvMemStorage* storage = cvCreateMemStorage();
CvSubdiv2D* subdivision = cvCreateSubdivDelaunay2D(rect, storage);
for (int i = 0; i < points.size(); ++i)
{
    cvSubdivDelaunay2DInsert(subdivision, points[i].Point);
}

cvCalcSubdivVoronoi2D(subdivision);
CvSeqReader reader;
CvSeq* seq = (CvSeq*) subdivision->edges;
cvStartReadSeq(seq, &reader);
for (int i = 0; i < seq->total; ++i)
{
    CvQuadEdge2D* edge = (CvQuadEdge2D*)reader.ptr;
    if (CV_IS_SET_ELEM(edge))
    {
       // TODO: implement some edge related logic here...   
    }
    CV_NEXT_SEQ_ELEM(seq->elem_size, reader);
}

if (storage != 0)
{
    cvReleaseMemStorage(&storage);
}

次に、型パラメーターとして CV_NEXT_AROUND_LEFT を指定して cvSubdiv2DGetEdge を使用できます。これは、同じファセット (三角形) からエッジを反復処理します。

于 2012-02-16T22:57:57.777 に答える