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

时间:2014-05-22 11:01:55

标签: python opencv computer-vision

我正在进行手指检测,即使用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

此处thresholded_img是黑白图像,其中指尖单独表示为白色,其他所有图像均为黑色。

在此代码中,如果thresholded_img包含一个白点,那么我可以正确获得该点的质心的xy坐标!

但是如何在这张图片中找到每个白点的质心?

dd

但如果阈值图像中有多个白点,那么它就会发现错误的质心!

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

请参阅此图片。 http://www.csksoft.net/data/pic/laserkbd/036.jpg

1 个答案:

答案 0 :(得分:2)

我使用the image you uploaded测试了以下代码。

我得到了以下文字输出:

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)]

和这张图片:

enter image description here

#!/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()

另请参阅问题https://stackoverflow.com/a/9059648/15485

的回答Python OpenCV - Find black areas in a binary image