我试图建立一个简单的图像分析工具,找到适合颜色范围的项目,然后找到所述对象的中心。
例如,在屏蔽之后,我正在分析这样的图像:
到目前为止,我在代码方面所做的事情相当简单:
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
然而,这给了我无数的轮廓。在阅读the corresponding manpage时,我有些不知所措。我可以利用时刻合理分析轮廓吗?轮廓甚至是正确的工具吗?
我发现this question,模糊地涵盖了找到一个物体的中心,但是当有多个物品时我该如何修改这种方法呢?
如何在图像中找到对象的中心?例如,在上面的示例图像中,我想找到三个点(矩形的中心和两个圆圈)。
答案 0 :(得分: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)
这给了我4个中心:
[(474, 411), (96, 345), (58, 214), (396, 145)]
这里要做的显而易见的事情是检查轮廓的面积,如果它是图像的百分比太小,不要把它算作真实的轮廓,它只是噪音。只需将这样的内容添加到for循环的顶部:
if cv2.contourArea(contours[i]) < 100:
continue
对于来自findContours
的返回值,我不确定第一个值是什么,因为它不存在于OpenCV的C ++版本中(这是我使用的)。第二个值显然只是轮廓(数组数组),第三个值是一个层次结构,包含轮廓嵌套的信息,非常方便。
答案 1 :(得分:0)
你可以使用你的控件上的opencv minEnclosingCircle()函数来获取每个对象的中心 看看这个用c ++编写的例子,但你可以调整逻辑Example