gpt4 book ai didi

opencv - C++-ObjC OpenCV 约束 Delaunay

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:24 24 4
gpt4 key购买 nike

我在 OpenCV 2.3.1 中成功实现了轮廓的 Delaunay 三角剖分。

使用 cvPointPolygonTest 我可以获得凸包中的所有三角形,然后我尝试在三角形质心上执行另一个 cvPointPolygonTest 以了解它们是否在主轮廓中,因此我可以拥有轮廓的约束三角剖分。

但是,它并不能很好地工作,因为一些三角形(例如,一个走路的人,他的两条腿很远)“越过”一个洞

有谁知道执行约束三角剖分的方法。我想到了 convexityDefects,但无法理解如何从这里开始。

提前致谢!


其实这不是Convex Hull缺陷问题,而是triangulation问题。这张图片会告诉你问题所在:

特别是在三角包的底部,您可以看到三角测量在轮廓内和轮廓外,因为 OpenCV 正在对凸包进行三角测量。我想找到一种对轮廓本身进行三角测量的方法。

我发现了一些关于在轮廓本身中添加斯坦纳点的想法,但找不到从 OpenCV 开始的地方。

我的想法是:

  • 测试三角形是否在轮廓内和轮廓外;
  • 如果为真:获取交点;
  • 并将其添加到 cvSubdiv2D。

我说的对吗?

感谢您的耐心解答!

最佳答案

最后我在我的程序中实现了 poly2tri 库。

这是结果(OpenCV 获取轮廓,然后 poly2tri 执行三角剖分):

// -------------------- poly2tri --------------------


NSMutableArray* temp = [[NSMutableArray alloc] init];

vector<p2t::Triangle*> triangles;
vector< vector<p2t::Point*> > polylines;
vector<p2t::Point*> polyline;

for(int i = 0; i < contour32->total; i++ ) {
CvPoint2D32f* pt32 = CV_GET_SEQ_ELEM(CvPoint2D32f, contour32, i);
polyline.push_back(new p2t::Point((double)pt32->x, (double)pt32->y));
}

polylines.push_back(polyline);


p2t::CDT* cdt = new p2t::CDT(polyline);



// TODO -> holes with CV_RETR_TREE

// Triangulation !
cdt->Triangulate();

// On exporte nos triangles
triangles = cdt->GetTriangles();

for (int i = 0; i < triangles.size(); i++) {

p2t::Triangle& t = *triangles[i];
p2t::Point& a = *t.GetPoint(0);
p2t::Point& b = *t.GetPoint(1);
p2t::Point& c = *t.GetPoint(2);

double x1 = (width / rWidth * (double)a.x) - (width / 2.f);
double y1 = (height / rHeight * (double)a.y) - (height / 2.f);
double x2 = (width / rWidth * (double)b.x) - (width / 2.f);
double y2 = (height / rHeight * (double)b.y) - (height / 2.f);
double x3 = (width / rWidth * (double)c.x) - (width / 2.f);
double y3 = (height / rHeight * (double)c.y) - (height / 2.f);

[temp addObject:[[NSArray arrayWithObjects:
[NSArray arrayWithObjects:
[NSNumber numberWithDouble:x1],
[NSNumber numberWithDouble:y1],
[NSNumber numberWithDouble:0.],
nil],
[NSArray arrayWithObjects:
[NSNumber numberWithDouble:x2],
[NSNumber numberWithDouble:y2],
[NSNumber numberWithDouble:0.],
nil],
[NSArray arrayWithObjects:
[NSNumber numberWithDouble:x3],
[NSNumber numberWithDouble:y3],
[NSNumber numberWithDouble:0.],
nil],
nil] autorelease]];

}

[outDelaunay addObject:temp];

其中 contour32 是您使用 cvFindContours 找到的 OpenCV 轮廓,然后转换为 float32。

关于opencv - C++-ObjC OpenCV 约束 Delaunay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8236201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com