[英]Is OpenCV's Subdiv2D / Delaunay broken when the point given to locate is one of the triangle's vertices?
用于构建三角剖分的代码:
CvSubdiv2D *subdiv;
CvMemStorage *storage = cvCreateMemStorage(0);
CvRect rectangle = cvRect(0, 0, 100, 100);
subdiv = cvCreateSubdivDelaunay2D(rectangle, storage);
CvPoint2D32f p1 = cvPoint2D32f(10, 10);
CvPoint2D32f p2 = cvPoint2D32f(50, 10);
CvPoint2D32f p3 = cvPoint2D32f(10, 50);
cvSubdivDelaunay2DInsert(subdiv, p1);
cvSubdivDelaunay2DInsert(subdiv, p2);
cvSubdivDelaunay2DInsert(subdiv, p3);
之后,使用以下几点之一进行查询:
CvSubdiv2DEdge edge;
CvSubdiv2DPoint *pp;
CvSubdiv2DPointLocation loc = cvSubdiv2DLocate(subdiv, p1, &edge, &pp);
得到结果后,必须检查该点是否落在:
在这种情况下,它是一个顶点:
if(loc == CV_PTLOC_VERTEX) {
// CvSubdiv2DPoint *tp = cvSubdiv2DEdgeOrg(edge);
// CvPoint2D32f point = tp->pt;
// std::cout << point.x << ", " << point.y << std::endl;
// CvSubdiv2DPoint *tp = cvSubdiv2DEdgeOrg(pp->first);
// CvPoint2D32f point = tp->pt;
// std::cout << point.x << ", " << point.y << std::endl;
}
但是,我的两种方法都失败了。 在前三行中,我尝试查看locate
是否在参数上放置了正确的边。 没错,我遇到了细分错误。 在第二个块中,我尝试访问CvSubdiv2DPoint
结构中的first
元素,但它也不起作用-分段错误。 我first
找不到这些点,也无法在其他边缘上使用它进行迭代。
CvSubdiv2DPoint
没用的原因是,为了遍历结构并实际找到三角形,我需要CvSubdiv2DEdge
,但是由于我无法从点转换为边,因此函数的结果是无用的。
我可能忽略了一些东西,但是对我来说似乎已经坏了。 这是文档。 有什么想法吗?
可以使用序列功能来迭代边缘,以下是代码:
CvMemStorage* storage = cvCreateMemStorage();
CvSubdiv2D* subdivision = cvCreateSubdivDelaunay2D(rect, storage);
for (int i = 0; i < points.size(); ++i)
{
cvSubdivDelaunay2DInsert(subdivision, points[i]);
}
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))
{
//Do something...
}
CV_NEXT_SEQ_ELEM(seq->elem_size, reader);
}
if (storage != 0)
{
cvReleaseMemStorage(&storage);
}
尽管我没有找到一种方法来迭代连接到某个顶点的边,但是通过使用细分本身作为序列,以相同的方式迭代顶点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.