2017-09-21 4 views
0

Je programme une application Java qui détecte des formes géométriques simples.Détection de formes géométriques simples à l'aide d'OpenCV [Java]

Le code Python suivant est utilisé comme référence: How to detect simple geometric shapes using OpenCV

Ceci est une partie du code [Python]:

contours,h = cv2.findContours(thresholdedImage,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) 

Utilisation des méthodes OpenCV de Java, je suis incapable d'extraire la " len "(longueur) propriété (afin de déterminer quelle forme a été détectée) d'un contour approximé.

Impression sur quelques contours produit des [Java]:

[ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x23ac75f0, dataAddr=0x1c7c66c0 ] 
[ 5*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x23ac7200, dataAddr=0x1c0e5fc0 ] 
etc. 

J'aimerais obtenir le nombre de points d'un objet de contour spécifique - la 4 et 5 du code ci-dessus.

Je sais que je pourrais le convertir en une chaîne, puis extraire les nombres, mais il doit y avoir une meilleure façon, non?

Merci pour vos réponses.

+0

Notez que 'len' obtient simplement le nombre d'éléments dans le tableau' approx'. Il ne calcule pas la «longueur» des points/lignes ou quoi que ce soit. C'est comme un '.length' en Java. Donc, il suffit de dire "s'il y a trois points c'est un triangle, cinq c'est un pentagone" et ainsi de suite. –

Répondre

1

Cela devrait faire l'affaire. (En supposant que vous ayez déjà yourImage stocké dans un objet MatOfPoint2f).

MatOfPoint2f approx = new MatOfPoint2f(); 
Imgproc.approxPolyDP(yourImage, approx, Imgproc.arcLength(yourImage, true) * 0.02, true); 
long count = approx.total(); 
if (count == 5) { 
    // this is a pentagon 
} 

Vérifiez this pour voir l'utilisation de total()

OpenCV sur Java devient un peu plus difficile par rapport à d'autres langages comme Python ou C++.

+0

Merci, cela a résolu le problème. – user2426320