繁体   English   中英

使用 opencv python 合并多个轮廓

[英]Merge multiple contour using opencv python

当我在这张图片上应用 OpenCV findContours() function 时,我发现它创建了两个单独的轮廓。 我正在尝试合并这两个轮廓以形成一个轮廓。 我的最终目标如下:

请忽略这些点。 我用注释工具创建了它。 最终的轮廓可能与给定的图像略有不同,但与此图像有些相似。 最重要的部分是获得轮廓的连续形状。

最终目标

我在下面用一些代码和图像来总结我的工作。

第一步(寻找轮廓):

使用 findContours() function 我得到了如下所示的轮廓:

contour = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, [contour], -1, (0,0,255), 2)

查找轮廓

第二步(合并轮廓):

然后我尝试使用 np.vstack() function 合并两个轮廓并将其绘制在图像上。 基本上,我已将两个轮廓坐标合二为一。

contours_combined = np.vstack(contour)
cv2.drawContours(img, [contours_combined], -1, (0,0,255), 2)

使用此代码,我得到了如图所示的轮廓:

轮廓组合

第三步(OpenCV 凸包的使用):

然后我使用堆叠的轮廓创建了凸包。

hull = cv2.convexHull(contours_combined)
cv2.polylines(img, [hull], True, (0,0,255), 2)

我得到了下面的图片:

凸包

我使用了 cv2.morphologyEx() 但不幸的是,这也没有帮助我实现我的目标(查看下图)。

形态学

如何获得第一张图片中显示的单个轮廓?

在您的特定情况下,有一种方法可以实现这一点:如果您比较单个轮廓和全局凸包,则恰好有两个段将顶点从一个轮廓连接到另一个轮廓的顶点。

所以诀窍是跟随凸包,并为每个顶点检查它属于哪个轮廓(凸包由顶点集的并集的子集定义)。 这可以有效地完成。

现在,当您确定船体和轮廓中的四个端点时,只需连接相关部分。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM