Delaunay三角形OpenCV

时间:2013-02-06 19:51:14

标签: opencv indexing triangulation delaunay

我想知道是否可以使用OpenCV检索CvSubdiv2D*细分中相邻顶点的索引。

CvSubdiv2DPoint* pt = cvSubdiv2DEdgeOrg( CvSubdiv2DEdge edge );
index= pt->id;

因此,如果我有坐标列表,我可以发现例如列表中的点15通过边缘连接到列表中的点300,210,400和76。

我知道得到坐标没问题,但我对此并不感兴趣。我想确定我不是在浪费时间尝试以这种方式检索索引,否则会尝试寻找其他解决方案。

2 个答案:

答案 0 :(得分:1)

我设法解决此问题的方法是修改CvPoint2D32f源文件中的types_c.h结构定义,以便在将点插入细分后存储点的索引及其坐标

以下是我所做的循序渐进程序:

  1. 打开types_c.h源文件(在我的情况下位于~/OpenCV-2.4.3/modules/core/include/opencv2/core/types_c.h)。在CvPoint2D32f结构中添加一个额外的字段,用于存储插入细分的点的索引。例如:

    typedef struct CvPoint2D32f
    {
        float x;
        float y;
        int index;
    }
    CvPoint2D32f;
    
  2. 再次构建源文件并安装它。

  3. 在将一个点插入细分之前,请确保存储该点的索引,如下面的代码:

    int i;
    for (i = 0; i < size; i++) {
        fp = cvPoint2D32f(x[i], y[i]);
        fp.index = i;
        cvSubdivDelaunay2DInsert(subdiv, fp);
    }
    
  4. 当单步执行细分内的边缘时,只需参考先前定义的索引字段即可访问索引。例如,就我而言,我这样做了如下:

        CvSubdiv2DPoint* ptSub = cvSubdiv2DEdgeOrg(delaunay_edge);
        CvPoint2D32f pt32f = ptSub->pt;
        whatYouWant = pt32f.index;
    
  5. 希望它有所帮助。 :)

答案 1 :(得分:-1)

是的,最好的方法是使用OpenCV 2。 他们在CvSubdiv2DPoint上添加了id。

    #define CV_SUBDIV2D_POINT_FIELDS()\
         int            flags;      \
         CvSubdiv2DEdge first;      \
        CvPoint2D32f   pt;         \
         int id;

typedef struct CvSubdiv2DPoint
{
     CV_SUBDIV2D_POINT_FIELDS()
}