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
Bereitstellung von Bildern würde helfen. – m3h0w