C++-ObjC OpenCV 约束 Delaunay
我在 OpenCV 2.3.1 中成功实现了轮廓的 Delaunay 三角剖分。
使用 cvPointPolygonTest 我可以获得凸包中的所有三角形,然后我尝试对三角形质心执行另一个 cvPointPolygonTest 以了解它们是否在主轮廓中,这样我就可以进行约束三角剖分轮廓。
但是,它效果不佳,因为某些三角形(例如,两条腿分开的步行者)“越过”一个洞。
有谁知道执行约束三角测量的方法。我考虑过凸面缺陷,但无法理解如何开始。
提前致谢 !
Ben
事实上,这不是凸包缺陷问题,而是三角剖分问题。此图片将向您展示问题:
特别是在三角外壳的底部,您可以看到三角测量位于轮廓内和轮廓外,因为 OpenCV 正在对凸包进行三角测量。我想找到一种方法来对轮廓本身进行三角测量。
我发现了一些关于在轮廓本身中添加斯坦纳点的想法,但找不到从 OpenCV 开始的地方。
我的想法是:
- 测试三角形是否在轮廓内和轮廓外;
- 如果 true :获取交点;
- 并将其添加到 cvSubdiv2D 中。
我这样说对吗?
感谢您的耐心和解答!
I succesfully implemented a Delaunay triangulation of a contour in OpenCV 2.3.1.
With cvPointPolygonTest I can get all the triangles in the convex hull, then I tried to perform another cvPointPolygonTest on triangles centroid to know if they are in the main contour or not, so I can have the constrained triangulation of the contour.
But, it doesn't work well, as some triangles are (eg. with a walking man who has his two legs distant) 'over' a hole.
Does anyone know a way to perform a constrained triangulation. I thought about convexityDefects, but can't manage to understand how to begin with this.
Thanks in advance !
Ben
In fact, it is not a Convex Hull defects problem, but a triangulation one. This image will show you the trouble :
Particularly in the bottom of the triangulated hull, you can see that the triangulation is in AND out of the contour, because OpenCV is triangulating the convex hull. I would like to find a way to triangulate the contour itself.
I found some ideas about adding Steiner Points in the contour itself, but can't find where to begin with OpenCV.
My idea was to :
- test if the triangle is in AND out of the contour ;
- if true : get the intersection point ;
- and add it to the cvSubdiv2D.
Am I right with this ?
Thanks for your patience and your answers !
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最后我在我的程序中实现了poly2tri库。
这是结果(OpenCV 获取轮廓,然后 poly2tri 执行三角测量):
其中contour32 是使用 cvFindContours 找到的 OpenCV 轮廓,然后转换为 float32。
Finally I implemented the poly2tri library in my program.
Here is the result (OpenCV to get the contours, then poly2tri to perform triangulation) :
where contour32 is your OpenCV contour found with cvFindContours, then converted to float32.
您必须使用:
这将返回
CvConvexityDefect
的序列(CvSeq),而不是 CvPoint 或您可能习惯的任何其他类似 CvSeq 的内容。您可以在循环中遍历缺陷,如下所示:
缺陷具有以下结构:
因此,在获取每个缺陷后,您可以从中构建点的 CvSeq 并在三角形的质心上使用
cvPointPolygonTest
看看它们是否在里面。如果它们位于缺陷内部,则意味着它们位于主轮廓外部。
希望这是您所需要的并且对您有所帮助。
You will have to use:
This will return a sequence(CvSeq) of
CvConvexityDefect
and not CvPoint or anything else like the CvSeq that you are probably used to.You can go trough the defects in a loop, like this:
A defect has the following structure:
So after getting each defect you can build a CvSeq of points from them and use
cvPointPolygonTest
on the centroids of the triangles to see if they are inside of them.If they are inside the defects, then it means that they are outside the main contour.
Hope this is what you need and that it helps.