2012-02-13 243 views
2

我在Ubuntu 11.04上使用NetBeans 7.1,並希望使用OpenCV從一組點中獲取三角形。我按照以下步驟構建Delaunay三角剖分。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

我看看這些功能here的文檔,但無法找到用於提取三角形的任何功能。

如果有人能告訴我如何提取三角形,我將不勝感激。

Peter。

回答

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); 
} 

然後你可以使用cvSubdiv2DGetEdge與CV_NEXT_AROUND_LEFT類型參數,它會遍歷從同一小邊(三角形)

+0

謝謝您的回覆,抱歉,我的答覆很慢。我剛剛注意到你的回覆。我一直無法找到LineSegment變量類型。我想知道你能否告訴我它在哪裏定義。非常感謝,彼得。 – OtagoHarbour 2012-02-26 14:59:06

+0

另外,如何定義邊界?謝謝,彼得。 – OtagoHarbour 2012-02-26 22:13:11

+0

哦,對不起,LineSegment是我的內部數據結構,我忘了在示例中刪除它。 – 2012-02-26 23:16:08