OpenCV Python unique (au lieu de plusieurs) blob de suivi?
J'ai essayé d'obtenir une couleur unique goutte de suivi thru OpenCV sur Python.
Le code ci-dessous fonctionne, mais il trouve le centre de gravité de toutes les marques de pixels, pas seulement le centre de gravité de la plus grosse goutte. C'est parce que je prends tout les moments de tous les pixels, mais je ne suis pas sûr quelle autre couleur de la piste.
Je suis un peu coincé sur ce exactement ce que je dois faire pour que ce soit une simple tache tracker au lieu d'un multi-blob moyenne er.
Voici le code:
#! /usr/bin/env python
#if using newer versions of opencv, just "import cv"
import cv2.cv as cv
color_tracker_window = "Color Tracker"
class ColorTracker:
def __init__(self):
cv.NamedWindow( color_tracker_window, 1 )
self.capture = cv.CaptureFromCAM(0)
def run(self):
while True:
img = cv.QueryFrame( self.capture )
#blur the source image to reduce color noise
cv.Smooth(img, img, cv.CV_BLUR, 3);
#convert the image to hsv(Hue, Saturation, Value) so its
#easier to determine the color to track(hue)
hsv_img = cv.CreateImage(cv.GetSize(img), 8, 3)
cv.CvtColor(img, hsv_img, cv.CV_BGR2HSV)
#limit all pixels that don't match our criteria, in this case we are
#looking for purple but if you want you can adjust the first value in
#both turples which is the hue range(120,140). OpenCV uses 0-180 as
#a hue range for the HSV color model
thresholded_img = cv.CreateImage(cv.GetSize(hsv_img), 8, 1)
cv.InRangeS(hsv_img, (120, 80, 80), (140, 255, 255), thresholded_img)
#determine the objects moments and check that the area is large
#enough to be our object
moments = cv.Moments(thresholded_img, 0)
area = cv.GetCentralMoment(moments, 0, 0)
#there can be noise in the video so ignore objects with small areas
if(area > 100000):
#determine the x and y coordinates of the center of the object
#we are tracking by dividing the 1, 0 and 0, 1 moments by the area
x = cv.GetSpatialMoment(moments, 1, 0)/area
y = cv.GetSpatialMoment(moments, 0, 1)/area
#print 'x: ' + str(x) + ' y: ' + str(y) + ' area: ' + str(area)
#create an overlay to mark the center of the tracked object
overlay = cv.CreateImage(cv.GetSize(img), 8, 3)
cv.Circle(overlay, (x, y), 2, (255, 255, 255), 20)
cv.Add(img, overlay, img)
#add the thresholded image back to the img so we can see what was
#left after it was applied
cv.Merge(thresholded_img, None, None, None, img)
#display the image
cv.ShowImage(color_tracker_window, img)
if cv.WaitKey(10) == 27:
break
if __name__=="__main__":
color_tracker = ColorTracker()
color_tracker.run()
OriginalL'auteur QuantumRich | 2012-10-17
Vous devez vous connecter pour publier un commentaire.
Vous devez faire comme ceci :
1) Obtenir le thresholded image à l'aide de inRange fonction, et vous pouvez appliquer un peu de l'érosion et de dilatation pour enlever les petits bruyant particules. Il aidera à améliorer la vitesse de traitement.
2) trouver les Contours à l'aide de " findContours fonction
3) trouver des zones de contours à l'aide de " contourArea fonction et sélectionnez l'une avec un maximum de zone.
4) Maintenant trouver son centre, comme vous l'avez fait, et de le suivre.
Ci-dessous est un exemple de code pour cette nouvelle cv2 module :
Vous pouvez trouver quelques exemples sur le suivi des objets colorés ici : https://github.com/abidrahmank/OpenCV-Python/tree/master/Other_Examples
Aussi, essayez d'utiliser de nouveaux cv2 interface. Il est beaucoup plus simple et plus rapide que l'ancien cv. Pour plus de détails, caisse : Quelle est la différence entre tous ces OpenCV Python interfaces?
nvm je viens de faire le nécessaire pour cv.ContourArea(liste(contour))
OriginalL'auteur Abid Rahman K
Après seuillage utiliser le blob de la détection ou de cvfindcontours pour obtenir des gouttes individuelles.
OriginalL'auteur Krish