c++ - OpenCV:从 Delaunay 三角剖分中提取三角形

标签 c++ opencv delaunay

我在 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 签名
底部
顶部
parent
block 大小
自由空间
block 大小 65408
自由空间 0

我查看了这些函数的文档 here但找不到任何提取三角形的函数。

如果有人能告诉我如何提取三角形,我将不胜感激。

彼得。

最佳答案

您可以像这样迭代边:

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 作为类型参数,它将在同一面(三角形)的边缘上迭代

关于c++ - OpenCV:从 Delaunay 三角剖分中提取三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254450/

相关文章:

c++ - 用C++计算球体的体积和表面积

c++ - 如何在计算中处理 "unsigned long long int"?

c++ - 对从 Eigen 获得的特征值和特征向量进行排序的有效方法

C++ 复制一个 vector 结构,但对象不同

python - 计算cv2.circle内的白色像素

javascript - 如何向 OpenCV.js 添加 `accumulateWeighted` 支持?

python - OpenCV 检测人脸、裁剪轮廓、使用 grabCut 以编程方式标记和删除背景

python - 返回 3D scipy.spatial.Delaunay 的表面三角形

python - 使用 Delaunay 三角剖分 (n-dim) 进行插值