OpenCV获取多个对象的中心

Nit*_*Nit 2 python opencv

我正在尝试构建一个简单的图像分析工具,该工具将查找适合颜色范围的项目,然后找到所述对象的中心。

例如,遮罩后,我正在分析如下图像:

样本图片

到目前为止,我在代码方面的工作非常简单:

import cv2
import numpy

bound = 30
inc = numpy.array([225,225,225])
lower = inc - bound
upper = inc + bound 
img = cv2.imread("input.tiff")
cv2.imshow("Original", img)
mask = cv2.inRange(img, lower, upper)
cv2.imshow("Range", mask)
contours = cv2.findContours(mask, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1)
print contours
Run Code Online (Sandbox Code Playgroud)

但是,这给了我无数的轮廓。在阅读相应的联机帮助页时,我有些茫然。我可以利用力矩来合理地分析轮廓吗?轮廓甚至是正确的工具吗?

我发现了这个问题,隐约地涵盖了找到一个对象的中心的问题,但是当有多个项目时,我将如何修改这种方法?

如何找到图像中对象的中心?例如,在上面的示例图像中,我正在寻找三个点(矩形和两个圆的中心)。

tex*_*ood 5

尝试print len(contours)。这将为您提供预期的答案。您看到的输出是轮廓的完整表示,可能是数千个点。

试试这个代码:

import cv2
import numpy

img = cv2.imread('inp.png', 0)
_, contours, _ = cv2.findContours(img.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1)
print len(contours)
centres = []
for i in range(len(contours)):
  moments = cv2.moments(contours[i])
  centres.append((int(moments['m10']/moments['m00']), int(moments['m01']/moments['m00'])))
  cv2.circle(img, centres[-1], 3, (0, 0, 0), -1)

print centres

cv2.imshow('image', img)
cv2.imwrite('output.png',img)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

这给了我4个中心:

[(474, 411), (96, 345), (58, 214), (396, 145)]
Run Code Online (Sandbox Code Playgroud)

在这里要做的显而易见的事情是还要检查轮廓区域,如果它在图像中所占的比例太小,则不要将其视为真实轮廓,而只是噪声。只需在for循环的顶部添加以下内容:

if cv2.contourArea(contours[i]) < 100:
  continue
Run Code Online (Sandbox Code Playgroud)

对于来自的返回值findContours,我不确定第一个值是什么,因为OpenCV的C ++版本中没有该值(这是我使用的值)。第二个值显然只是轮廓(数组的数组),第三个值是一个层次结构,其中包含有关轮廓嵌套的信息,这可能非常方便。

在此处输入图片说明