【问题标题】:OpenCV: Extracting Triangles from Delaunay TriangulationOpenCV:从 Delaunay 三角剖分中提取三角形
【发布时间】:2012-03-04 11:55:03
【问题描述】:

我在 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 签名
底部
顶部
父母
块大小
空闲空间
块大小 65408
空闲空间 0

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

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

彼得。

【问题讨论】:

    标签: c++ opencv delaunay


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

    【讨论】:

    • 感谢您的回复,对我回复缓慢感到抱歉。我刚刚注意到你的回复。我一直找不到 LineSegment 变量类型。我想知道你能不能告诉我它是在哪里定义的。非常感谢,彼得。
    • 另外,边是如何定义的?谢谢,彼得。
    • 哦,抱歉,LineSegment 是我的内部数据结构,示例中忘记删除了。
    • 是否应该删除 if (CV_IS_SET_ELEM(edge)) 块?谢谢。
    • 没有。您应该在 if (CV_IS_SET_ELEM(edge)) 块中实现您的逻辑。
    猜你喜欢
    • 2013-05-12
    • 2016-02-08
    • 2014-01-21
    • 2015-01-07
    • 2019-04-18
    • 2010-12-23
    • 2020-10-17
    • 2019-09-28
    • 2021-05-14
    相关资源
    最近更新 更多