我在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
prev 0x0
下一个0x2a2e5730
顶部0x2cc947d0
prev 0x2cc84840
下一个0x0
父0x0
签名
底部
顶部
父
BLOCK_SIZE
FREE_SPACE
block_size 65408
free_space 0
我查看了这些函数here的文档,但找不到用于提取三角形的任何函数。
如果有人能告诉我如何提取三角形,我将非常感激。
彼得。
答案 0 :(得分: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作为类型参数,它将在同一个facet(三角形)的边缘上迭代