web-dev-qa-db-fra.com

Comment détecter des formes géométriques simples à l'aide d'OpenCV

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.

enter image description here

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?

45
Registered User

Si vous n’avez que ces formes régulières, il existe une procédure simple, comme suit:

  1. Trouver des contours dans l'image (l'image doit être binaire, comme indiqué dans votre question)
  2. Approximez chaque contour en utilisant la fonction approxPolyDP.
  3. Tout d’abord, vérifiez le nombre d’éléments dans les contours approximatifs de toutes les formes. C'est reconnaître la forme. Par exemple, square en aura 4, le pentagone en aura 5. Les cercles en auront plus, je ne sais pas, alors nous le trouvons. (J'en ai 16 pour le cercle et 9 pour le demi-cercle.)
  4. Assignez maintenant la couleur, lancez le code de votre image test, vérifiez son numéro, remplissez-le avec les couleurs correspondantes.

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:

enter image description here

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

78
Abid Rahman K

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

21
Vlad

Vous pouvez également utiliser correspondance de modèle pour détecter des formes dans une image.

3
chans