J'ai ce projet où j'ai besoin (sur iOS) de détecter des formes géométriques simples à l'intérieur d'une image.
Après une recherche sur Internet, j'ai conclu que le meilleur outil pour cela est OpenCV. Le fait est que, il y a deux heures à peine, je ne savais pas ce qu'est OpenCV et je n'ai même jamais rien fait à distance impliquant le traitement d'images. Mon expérience principale est JS/HTML, C #, SQL, Objective-C ...
Où est-ce que je commence avec ça?
J'ai trouvé ceci réponse que j'ai pu digérer et en lisant déjà d'autres choses, je comprends qu'OpenCV doit renvoyer un tableau de formes avec les points/coins, est-ce vrai? De plus, comment représentera-t-il un cercle ou un demi-cercle? Et qu'en est-il de l'orientation de la forme?
Connaissez-vous un projet de démonstration iOS capable de démontrer une fonctionnalité similaire?
Si vous n’avez que ces formes régulières, il existe une procédure simple, comme suit:
approxPolyDP
.Voici mon exemple en Python:
import numpy as np
import cv2
img = cv2.imread('shapes.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,1)
contours,h = cv2.findContours(thresh,1,2)
for cnt in contours:
approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
print len(approx)
if len(approx)==5:
print "pentagon"
cv2.drawContours(img,[cnt],0,255,-1)
Elif len(approx)==3:
print "triangle"
cv2.drawContours(img,[cnt],0,(0,255,0),-1)
Elif len(approx)==4:
print "square"
cv2.drawContours(img,[cnt],0,(0,0,255),-1)
Elif len(approx) == 9:
print "half-circle"
cv2.drawContours(img,[cnt],0,(255,255,0),-1)
Elif len(approx) > 15:
print "circle"
cv2.drawContours(img,[cnt],0,(0,255,255),-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ci-dessous la sortie:
Rappelez-vous, cela ne fonctionne que pour les formes régulières.
Alternativement, pour trouver des cercles, vous pouvez utiliser houghcircles
. Vous pouvez trouver un tutoriel ici .
Concernant iOS , les développeurs OpenCV développent des exemples iOS cet été. Visitez donc leur site: www.code.opencv.org et contactez-les.
Vous pouvez trouver des diapositives de leur tutoriel ici: http://code.opencv.org/svn/gsoc2012/ios/trunk/doc/CVPR2012_OpenCV4IOS_Tutorial.pdf
La réponse dépend de la présence d'autres formes, du niveau de bruit éventuel et de l'invariance que vous souhaitez fournir (par exemple, rotation, mise à l'échelle, etc.). Ces exigences définiront non seulement l'algorithme mais également les étapes de prétraitement requises pour extraire les fonctionnalités.
Correspondance de modèle qui a été suggéré ci-dessus fonctionne bien lorsque les formes ne sont pas pivotées ou mises à l'échelle et lorsqu'il n'y a pas de formes similaires autour; autrement dit, il trouve la meilleure traduction dans l'image où se trouve le modèle:
double minVal, maxVal;
Point minLoc, maxLoc;
Mat image, template, result; // template is your shape
matchTemplate(image, template, result, CV_TM_CCOEFF_NORMED);
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); // maxLoc is answer
hachage géométrique est une bonne méthode pour obtenir une invariance en termes de rotation et de mise à l'échelle; cette méthode nécessiterait l'extraction de certains points de contour.
Generalized Hough transform peut prendre en charge l'invariance, le bruit et aurait un pré-traitement minimal, mais il est un peu plus difficile à implémenter que d'autres méthodes. OpenCV a de telles transformations pour les lignes et les cercles.
Dans le cas où le nombre de formes est limité, le calcul des moments ou le comptage des sommets de coque convexe peut constituer la solution la plus simple: analyse de structure openCV
Vous pouvez également utiliser correspondance de modèle pour détecter des formes dans une image.