¿Encontrar los centroides separados de cada puntos blancos en un marco?

Estoy haciendo detección de dedos, es decir, las yemas de los dedos usando una cámara VGA. He utilizado HSV y umbral de imagen y puedo detectar las yemas de los dedos.

El problema: ahora puedo encontrar el centroide de la mancha blanca en una imagen en blanco y negro si solo hay una mancha blanca (si coloco un solo dedo); pero si coloco varios dedos, aparecerán más manchas blancas en la imagen final. Así que quiero encontrar cada centroide por separado.

Quiero encontrar todos los centroides de cada uno de los puntos blancos, es decir, si coloco más de un dedo delante de la cámara. Mira el código de abajo

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 

Aquí thresholded_img es una imagen en blanco y negro donde las puntas de los dedos solo se representan en blanco y todas las demás en negro.

En este código, si thresholded_img contiene un único punto blanco, entonces puedo obtener las coordenadas x e y del centroide de ese punto correctamente.

Pero, ¿cómo encontrar el centroide de cada punto blanco en esta imagen?

dd

Pero si hay varios puntos blancos en la imagen con umbral, ¡está encontrando el centroide incorrecto!

¿Cómo puedo cambiar el código anterior para encontrar (coordenadas x, y) centroide separado de cada punto blanco en un solo cuadro (imagen)?

Consulte esta imagen por favor. http://www.csksoft.net/data/pic/laserkbd/036.jpg

Probé el siguiente código con la imagen que subiste .

Obtuve el siguiente resultado textual:

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

y esta imagen:

introduzca la descripción de la imagen aquí

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

Consulte también esta respuesta https://stackoverflow.com/a/9059648/15485 para la pregunta OpenCV de Python – Encuentre áreas negras en una imagen binaria