我正在进行手指检测,即使用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
包含一个白点,那么我可以正确获得该点的质心的x
和y
坐标!
但是如何在这张图片中找到每个白点的质心?
但如果阈值图像中有多个白点,那么它就会发现错误的质心!
如何更改上面的代码以找到(x,y坐标)单个帧(图像)中每个白点的单独质心?
答案 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)]
和这张图片:
#!/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