Puisque personne n'a mis en ligne une solution OpenCV complète, voici une approche simple :
-
Obtenir une image binaire. Nous chargeons l'image, la convertissons en niveaux de gris, puis obtenons une image binaire en utilisant Le seuil d'Otsu
-
Trouvez le contour extérieur. Nous trouvons les contours en utilisant findContours
et ensuite extraire les coordonnées de la boîte de délimitation en utilisant boundingRect
-
Trouver la coordonnée du centre. Puisque nous avons le contour, nous pouvons trouver la coordonnée centrale en utilisant moments pour extraire le centroïde du contour
Voici un exemple avec la boîte englobante et le point central mis en évidence en vert.
Image d'entrée ->
Sortie
Center: (100, 100)
Center: (200, 200)
Center: (300, 300)
Donc, pour récapituler :
Étant donné un objet sur un fond blanc uni, quelqu'un sait-il si OpenCV fournit une fonctionnalité permettant de détecter facilement un objet à partir d'une image capturée ?
Obtenez d'abord une image binaire ( Détection des bords à la Canny , seuillage simple , Le seuil d'Otsu o Seuil adaptatif ) et ensuite trouver les contours en utilisant findContours
. Pour obtenir les coordonnées du rectangle de délimitation, vous pouvez utiliser boundingRect
qui vous donnera les coordonnées sous la forme de x,y,w,h
. Pour dessiner le rectangle, vous pouvez le dessiner avec rectangle
. Vous obtiendrez ainsi les 4 points d'angle du contour. Si vous vouliez obtenir le point central, utilisez moments
pour extraire le centroïde du contour
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()