我想知道是否可以CvSubdiv2D*
使用 OpenCV 检索细分中相邻顶点的索引。
CvSubdiv2DPoint* pt = cvSubdiv2DEdgeOrg( CvSubdiv2DEdge edge );
index= pt->id;
因此,如果我有一个坐标列表,我可以发现例如列表中的点 15 通过边连接到列表中的点 300、210、400 和 76。
我知道获取坐标没问题,但我对此不感兴趣。我想确保我不会浪费时间尝试以这种方式检索索引,否则会尝试寻找其他解决方案。
我想知道是否可以CvSubdiv2D*
使用 OpenCV 检索细分中相邻顶点的索引。
CvSubdiv2DPoint* pt = cvSubdiv2DEdgeOrg( CvSubdiv2DEdge edge );
index= pt->id;
因此,如果我有一个坐标列表,我可以发现例如列表中的点 15 通过边连接到列表中的点 300、210、400 和 76。
我知道获取坐标没问题,但我对此不感兴趣。我想确保我不会浪费时间尝试以这种方式检索索引,否则会尝试寻找其他解决方案。
我设法解决这个问题的方法是修改源文件中的CvPoint2D32f
结构定义types_c.h
,以便在将点插入细分后存储点的索引及其坐标。
这是我所做的分步过程:
打开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;
再次构建源文件并安装它。
在将点插入细分之前,请确保存储点的索引,如以下代码所示:
int i;
for (i = 0; i < size; i++) {
fp = cvPoint2D32f(x[i], y[i]);
fp.index = i;
cvSubdivDelaunay2DInsert(subdiv, fp);
}
在您的细分内单步执行边缘时,您可以通过引用先前定义的索引字段来访问索引。例如,就我而言,我这样做如下:
CvSubdiv2DPoint* ptSub = cvSubdiv2DEdgeOrg(delaunay_edge);
CvPoint2D32f pt32f = ptSub->pt;
whatYouWant = pt32f.index;
希望能帮助到你。:)
是的,最好的方法是使用 OpenCV 2。他们已将 id 添加到 CvSubdiv2DPoint。
#define CV_SUBDIV2D_POINT_FIELDS()\
int flags; \
CvSubdiv2DEdge first; \
CvPoint2D32f pt; \
int id;
和
typedef struct CvSubdiv2DPoint
{
CV_SUBDIV2D_POINT_FIELDS()
}