opencv 如何在图像中找到最右边和最左边的轮廓[已关闭]

goucqfw6  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(262)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

2天前关闭。
Improve this question
我有一个图像,图像上有多条垂直线。我使用cv.findContours成功地找到了所有的轮廓。在其他情况下,我使用cv.contourArea选择了最大的轮廓,但在这种情况下,面积对我没有帮助。我如何找到最右边的轮廓和最左边的轮廓?
这是我用来找到两个最大轮廓的代码。有没有办法操纵这段代码来找到最右边和最左边的轮廓?

_, contours_red, _ = cv.findContours(mask_red1, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
        if len(contours_red) >= 2:
            contours_red = sorted(contours_red, key=cv.contourArea, reverse=True)[0:2]

我看到另一个论坛提到使用cv.moments(),但是查看cv.moments()的文档,我认为这不起作用。
我考虑使用for循环遍历每个轮廓,找到每个轮廓的平均列像素坐标,然后比较每个坐标,直到找到最右边和最左边的坐标,但我希望有一种更简单、更快的方法来完成这一任务。

vlf7wbxs

vlf7wbxs1#

a)如果要比较轮廓的质心,可以使用np.average,如下所示:

x_centroids = np.empty([len(contours_red), ], dtype=np.float32)
for i in range(len(contours_red)):
    cnt = contours_red[i]
    x_centroids[i] = np.average(cnt[:, 0, 0])

left_idx = np.argmin(x_centroids)
right_idx = np.argmax(x_centroids)

这些将是contours_red中最左和最右轮廓的索引。
B)如果您需要包含最左侧和最右侧顶点的轮廓,您可以分别使用np.minnp.max

min_x = np.empty([len(contours_red), ], dtype=np.float32)
max_x = np.empty([len(contours_red), ], dtype=np.float32)
for i in range(len(contours_red)):
    cnt = contours_red[i]
    min_x[i] = np.min(cnt[:, 0, 0])
    max_x[i] = np.max(cnt[:, 0, 0])

left_idx = np.argmin(min_x)
right_idx = np.argmax(max_x)

c)如果您仔细遵循以下文档,您也可以使用moments来查找质心:https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_features.html

相关问题