Da niemand eine vollständige OpenCV-Lösung veröffentlicht hat, hier ein einfacher Ansatz:
-
Erhalten Sie ein binäres Bild. Wir laden das Bild, wandeln es in Graustufen um und erhalten dann ein binäres Bild mit Otsus Schwelle
-
Finden Sie die äußere Kontur. Wir finden Konturen mit findContours
und extrahieren Sie dann die Bounding-Box-Koordinaten mit boundingRect
-
Finden Sie die mittlere Koordinate. Da wir die Kontur haben, können wir die Mittelpunktskoordinate finden, indem wir Momente zur Extraktion des Schwerpunkts der Kontur
Hier ein Beispiel, bei dem der Begrenzungsrahmen und der Mittelpunkt grün hervorgehoben sind
Eingangsbild ->
Ausgabe
Center: (100, 100)
Center: (200, 200)
Center: (300, 300)
Um es noch einmal zusammenzufassen:
Gegeben ein Objekt auf einem einfachen weißen Hintergrund, weiß jemand, ob OpenCV bietet Funktionalität, um leicht ein Objekt aus einem erfassten Frame zu erkennen?
Erstellen Sie zunächst ein binäres Bild ( Geschickte Kantenerkennung , einfache Schwellenwertberechnung , Otsus Schwelle , oder Adaptive Schwelle ) und dann die Konturen mit findContours
. Um die Koordinaten des begrenzenden Rechtecks zu erhalten, können Sie Folgendes verwenden boundingRect
die Ihnen die Koordinaten in Form von x,y,w,h
. Um das Rechteck zu zeichnen, können Sie es mit rectangle
. So erhalten Sie die 4 Eckpunkte der Kontur. Wenn Sie den Mittelpunkt erhalten möchten, verwenden Sie moments
zur Extraktion des Schwerpunkts der Kontur
Code
import cv2
import numpy as np
# Load image, convert to grayscale, and Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find contours and extract the bounding rectangle coordintes
# then find moments to obtain the centroid
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
# Obtain bounding box coordinates and draw rectangle
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
# Find center coordinate and draw center point
M = cv2.moments(c)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(image, (cx, cy), 2, (36,255,12), -1)
print('Center: ({}, {})'.format(cx,cy))
cv2.imshow('image', image)
cv2.waitKey()