2017-01-24 3 views
0

J'essaie de trouver les coordonnées de chaque coin d'un rectangle donné. Jusqu'ici j'ai été capable d'obtenir deux angles en utilisant la fonction de contours, mais quand je regarde dans tout le tableau de contour, il y a une abondance de points à passer au crible. Je suis à la recherche que pour les valeurs les plus extrêmes (max et min x et y) valeursTrouver les coordonnées des contours

import cv2 
import numpy as np 

#open image 
img = cv2.imread('cnt-coords.jpg') 

#convert to black and white 
bw = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

#threshold image 
ret, thresh = cv2.threshold(bw,127,255,0) 

#find contours 
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

#obtain the first 2 points of contours 
cntx1 = contours[0][0] 
cntx = contours[0][1] 

#convert coords to points 
pt1 = (cntx1[0][0],cntx1[0][1]) 
pt2 = (cntx[0][0],cntx[0][1]) 

#draw circles on coordinates 
cv2.circle(img,pt1,5,(0,255,0),-1) 
cv2.circle(img,pt2, 5, (0,255,0),-1) 

#display the image 
cv2.imshow('f',img) 

cv2.waitKey(0) 
cv2.destroyAllWindows() 

je passé au crible ce que contours me revient et son un grand éventail de points, ce qui semble être tous les points le long de la diagonale de mon image. Est-il possible de simplifier les points que je reçois, en l'occurrence les coins de ce rectangle/parallélogramme?

test contours

Répondre

1

fonction retourne findContours pixels sur le contour. Vous pouvez essayer la fonction approxPolyDP d'OpenCV pour trouver une approximation polygonale du contour. L'utilisation et l'explication peuvent être trouvées here. Dans votre cas, ce serait quelque chose comme:

epsilon = cv2.arcLength(contours[0],True) 
approx = cv2.approxPolyDP(contours[0],epsilon,True) 
+0

Merci - en utilisant une longueur d'arc d'environ 10%, j'ai été capable de localiser les quatre coins de la forme parallélogramme/rectangle –