2017-03-16 5 views
0

Ich arbeite an einem Objekterkennungs- und Tracking-System, der Eingang ist ein RGB-Webcam-Stream. Mein Code hat keine Probleme z. gelbe, grüne und blaue geometrische Objekte wie Bälle, aber wenn es um rote Bälle geht, fordere ich ein Problem heraus.OpenCV + Python rot Ball Erkennung und Tracking

# converting the input stream into HSV color space 
hsv_conv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

# because hue wraps up and to extract as many "red objects" as possible, I define lower and upper boundaries for brighter and for darker red shades 
bright_red_lower_bounds = (0, 100, 100) 
bright_red_upper_bounds = (10, 255, 255) 
bright_red_mask = cv2.inRange(hsv_conv_img, bright_red_lower_bounds, bright_red_upper_bounds) 

dark_red_lower_bounds = (160, 100, 100) 
dark_red_upper_bounds = (179, 255, 255) 
dark_red_mask = cv2.inRange(hsv_conv_img, dark_red_lower_bounds, dark_red_upper_bounds) 

# after masking the red shades out, I add the two images 
weighted_mask = cv2.addWeighted(bright_red_mask, 1.0, dark_red_mask, 1.0, 0.0) 

# then the result is blurred 
blurred_mask = cv2.GaussianBlur(weighted_mask,(9,9),3,3) 

# some morphological operations (closing) to remove small blobs 
erode_element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 
dilate_element = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8)) 
eroded_mask = cv2.erode(blurred_mask,erode_element) 
dilated_mask = cv2.dilate(eroded_mask,dilate_element) 

# on the color-masked, blurred and morphed image I apply the cv2.HoughCircles-method to detect circle-shaped objects 
detected_circles = cv2.HoughCircles(dilated_mask, cv2.HOUGH_GRADIENT, 1, 150, param1=100, param2=20, minRadius=20, maxRadius=200) 
if detected_circles is not None: 
    for circle in detected_circles[0, :]: 
     circled_orig = cv2.circle(frame, (circle[0], circle[1]), circle[2], (0,255,0),thickness=3) 
    cv2.imshow("original", circled_orig) 
else: 
    cv2.imshow("original", frame) 

Problem: durch eine breite Palette von „red“ Definieren von HSV zu extrahieren, Teile von Hand und Gesicht (wenn vor der Kamera steht, die Kugelhalte) sind zu extrahiert. Später entdeckt die HoughCircles-Methode kleine Kreise im restlichen Bereich meiner Hand und meines Gesichts.

Ich spielte ein wenig mit den (nicht so leicht zu justieren) Parameter für cv2.HoughCircles, z. Ein kleiner Wert von param2 erkennt viel mehr (falsche) Kreise als ein größerer Wert.

Hat jemand eine Idee, wie man dieses Problem überwinden und die falsch erkannten Kreise beseitigen kann? Voraussetzung: Das System weiß nichts über die Größe der Bälle, es sollte viel erkennen. Daher kann ich keinen minimalen oder maximalen Kreisradius definieren, um die falsch positiven Werte zu eliminieren.

Vielen Dank im Voraus. Grüße, Chris

ps: das Stück Code ist eng orientiert an this one

+1

Bereitstellung von Bildern würde helfen. – m3h0w

Antwort

0

Da die rötlichen Bereiche auf dem Gesicht und Hände sind - wie ich hoffe - viel weniger homogen als die Kugel, versuchen vor dem HSV Unschärfe Schwellenwertbildung Das sollte die roten Bereiche weicher machen, wo man sie nicht entdecken will und am Ball sollte die Farbe mehr oder weniger gleich bleiben.

BEARBEITEN: Wenn das Beispiel, das Sie in einem Kommentar angegeben haben, der tatsächlichen Situation nahekommt, beweist es, dass die Unschärfe Ihr Problem lösen wird. Was Sie im Grunde tun möchten, ist mehrere Trackbars zu erstellen und sie gleichzeitig für verschiedene Arten von Unschärfe anzupassen; morphologische Operationen; und die HSV-Schwellenwertbildung selbst (da die Unschärfe die besten Werte für die Schwellenwerte ändern könnte). Experimentieren Sie mit einer Live-Ansicht der resultierenden erkannten Region und das sollte Ihnen helfen, herauszufinden, was hilft und was nicht.

Wie mein Professor sagte: "Wenn unsere Augen sehen können, kann der Computer es sehen". Und das ist hier klar der Fall - der Ball hat eine ganz andere Farbe als Beckhams Gesicht.

+0

Da ich kein Bild von mir posten möchte, habe ich ein Beispiel erstellt, das ziemlich gut zeigt, was das Problem ist https://cruzlercloud.feste-ip.net/index.php/s/aq0lQvOfywj82Ao Wie Sie sehen können der Ball ist nicht wirklich gut sichtbar und theres ein Teil "ausgeschattet". Der mittlere Teil des Gesichts wird fälschlicherweise als Kreis erkannt. Ihr Tipp bezüglich der Unschärfe des Bildes vor der HSV-Schwelle verbessert es ein wenig, aber es gibt immer noch falsch erkannte Kreise. –

+0

Verwenden Sie bitte imgur oder einen anderen vertrauenswürdigen Anbieter. – m3h0w

+0

http://imgur.com/a/k6x23 –

Verwandte Themen