【问题标题】:Delaunay triangle OpenCV德劳内三角 OpenCV
【发布时间】:2013-01-22 03:37:32
【问题描述】:

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

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

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

我知道获取坐标没问题,但我对此不感兴趣。我想确保我不会浪费时间尝试以这种方式检索索引,或者尝试寻找其他解决方案。

【问题讨论】:

    标签: opencv indexing triangulation delaunay


    【解决方案1】:

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

    这是我所做的分步过程:

    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;
      

    希望对您有所帮助。 :)

    【讨论】:

      【解决方案2】:

      是的,最好的方法是使用 OpenCV 2。 他们已将 id 添加到 CvSubdiv2DPoint。

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

      typedef struct CvSubdiv2DPoint
      {
           CV_SUBDIV2D_POINT_FIELDS()
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-27
        • 2015-08-29
        • 2016-04-21
        • 2021-08-24
        • 2020-05-12
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        相关资源
        最近更新 更多