如何使用 Python OpenCV 获取图像中每个轮廓对象的尺寸?

kto*_*tom 0 python opencv image-processing shapes contour

我正在开发一个项目,该项目涉及自动单击视频游戏中出现在屏幕上的对象。当然,每个对象都有一个独特的蓝色轮廓 - 所以我从图像中分离出了除蓝色之外的所有颜色。

下图显示了经过预处理的游戏屏幕截图示例。在 Python 中使用 OpenCV,我怎样才能:

  • 获取每个对象最中心像素的位置?
  • 获取每个对象最顶部像素的位置?

三个相似斑点的图像

例如,

三个相似斑点的图像,粗略地指出了它们的中心和顶部

Ann*_*Zen 5

您可以使用一种相对鲜为人知的cv2方法cv2.moments()

import cv2

img = cv2.imread("image.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    moments = cv2.moments(cnt)
    center_x = int(moments["m10"] / moments["m00"])
    center_y = int(moments["m01"] / moments["m00"])
    top_x, top_y = cnt[cnt[..., 1].argmin()][0]
    cv2.circle(img, (center_x, center_y), 3, (0, 0, 255), -1)
    cv2.circle(img, (top_x, top_y), 3, (0, 0, 255), -1)
    
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

输入图像:

在此输入图像描述

输出图像:

在此输入图像描述

变量名已经很好地解释了代码,毕竟 Python 与简单的英语类似!