Python 找到一帧中每个白点的单独质心?

Python 找到一帧中每个白点的单独质心?,python,opencv,computer-vision,Python,Opencv,Computer Vision,我正在使用VGA摄像头检测手指,即指尖。我使用了HSV和图像阈值,我能够检测到指尖 问题是:如果只有一个白点(如果我只放一个手指),我现在可以在黑白图像中找到白点的质心;但是,如果我放置多个手指,最终图像中会出现更多的白点。所以我想分别找到每个质心 我想找到每个白点的所有质心,即如果我将一个以上的手指放在相机前面。请看下面的代码 thresholded_img = cv.CreateImage(cv.GetSize(hsv_img), 8, 1) cv.InRangeS(hsv_img, (

我正在使用VGA摄像头检测手指,即指尖。我使用了HSV和图像阈值,我能够检测到指尖

问题是:如果只有一个白点(如果我只放一个手指),我现在可以在黑白图像中找到白点的质心;但是,如果我放置多个手指,最终图像中会出现更多的白点。所以我想分别找到每个质心

我想找到每个白点的所有质心,即如果我将一个以上的手指放在相机前面。请看下面的代码

thresholded_img =  cv.CreateImage(cv.GetSize(hsv_img), 8, 1) 
cv.InRangeS(hsv_img, (0,0,200), (0,0,255), thresholded_img)
moments = cv.Moments(cv.GetMat(thresholded_img,1), 0) 
area = cv.GetCentralMoment(moments, 0, 0) 
x = cv.GetSpatialMoment(moments, 1, 0)/area 
y = cv.GetSpatialMoment(moments, 0, 1)/area 
posY=y
posX=x
这里的
threshold_img
是一个黑白图像,其中指尖单独表示为白色,其他全部表示为黑色

在这个代码中,如果
threshold_img
包含一个白点,那么我可以正确地获得该点质心的
x
y
坐标

但如何找到图像中每个白点的质心呢

但是如果阈值图像中有多个白点,那么它就找到了错误的质心

如何更改上述代码以在单个帧(图像)中找到每个白点的单独质心(x,y坐标)

请参考这张图片。

我使用测试工具测试了以下代码

我得到了以下文本输出:

cv2 version: 2.4.4
centroids: [(580, 547), (437, 546), (276, 545), (115, 545), (495, 425), (334, 424), (174, 424), (24, 423), (581, 304), (437, 303), (277, 303), (117, 302), (495, 182), (334, 181), (174, 181), (25, 181), (581, 60), (438, 59), (277, 59), (117, 59)]
这张图片:

#!/usr/bin/env python

import cv2

img = cv2.imread('HFOUG.jpg',cv2.CV_LOAD_IMAGE_GRAYSCALE)
_,img = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
h, w = img.shape[:2]

contours0, hierarchy = cv2.findContours( img.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
moments  = [cv2.moments(cnt) for cnt in contours0]
# Nota Bene: I rounded the centroids to integer.
centroids = [( int(round(m['m10']/m['m00'])),int(round(m['m01']/m['m00'])) ) for m in moments]

print 'cv2 version:', cv2.__version__
print 'centroids:', centroids

for c in centroids:
    # I draw a black little empty circle in the centroid position
    cv2.circle(img,c,5,(0,0,0))

cv2.imshow('image', img)
0xFF & cv2.waitKey()
cv2.destroyAllWindows()


另请参见此问题的答案

顺便说一句,请改用cv2 api,过时的cv api将不会出现在下一版本中。如果您使用FindOntours,你可以得到找到的每个轮廓的矩/质心。有人能给我一个示例代码,在上面的图像中找到单独的白点中心吗???@user3429616看到我的答案了吗?当它找到一个点时,它给出了一个零的浮点除法。。。请注意,我的位置没有100%填满,这可能就是为什么。@Fuseldieb我只在问题的图像上测试了代码。根据图像处理»结构分析和形状描述符中的
cv::Moments类参考
,由于轮廓力矩是使用格林公式计算的,因此对于具有自相交的轮廓,您可能会得到看似奇怪的结果,例如蝴蝶形轮廓的零区域(
m00
)。