OpenCV - à l'aide de cv2.approxPolyDP() correctement

Je suis en train d'extraire une approximation du contour dans une image, à l'aide de cv2.approxPolyDP(). Voici l'image que je suis en utilisant:

OpenCV - à l'aide de cv2.approxPolyDP() correctement

Mon code tente d'isoler l'île principale et de définir et tracer le contour de l'approximation et le contour de la coque. J'ai tracé le contour trouvé en vert, le rapprochement en rouge:

import numpy as np
import cv2
# load image and shrink - it's massive
img = cv2.imread('../data/UK.png')
img = cv2.resize(img, None,fx=0.25, fy=0.25, interpolation = cv2.INTER_CUBIC)
# get a blank canvas for drawing contour on and convert img to grayscale
canvas = np.zeros(img.shape, np.uint8)
img2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# filter out small lines between counties
kernel = np.ones((5,5),np.float32)/25
img2gray = cv2.filter2D(img2gray,-1,kernel)
# threshold the image and extract contours
ret,thresh = cv2.threshold(img2gray,250,255,cv2.THRESH_BINARY_INV)
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# find the main island (biggest area)
cnt = contours[0]
max_area = cv2.contourArea(cnt)
for cont in contours:
if cv2.contourArea(cont) > max_area:
cnt = cont
max_area = cv2.contourArea(cont)
# define main island contour approx. and hull
perimeter = cv2.arcLength(cnt,True)
epsilon = 0.01*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
hull = cv2.convexHull(cnt)
# cv2.isContourConvex(cnt)
cv2.drawContours(canvas, cnt, -1, (0, 255, 0), 3)
cv2.drawContours(canvas, approx, -1, (0, 0, 255), 3)
## cv2.drawContours(canvas, hull, -1, (0, 0, 255), 3) # only displays a few points as well.
cv2.imshow("Contour", canvas)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
cv2.destroyAllWindows()

Voici les images qui en résultent:

OpenCV - à l'aide de cv2.approxPolyDP() correctement

La première image illustre le contour en vert. La deuxième parcelles de l'approximation dans la red - comment puis-je tracer cette approximation continue courbe fermée?

La la documentation n'est pas très claire et il n'est ni le tutoriel, mais ma compréhension est que cv2.approxPolyDP() doit définir un processus continu, une courbe fermée, je devrais être capable de tracer avec cv2.drawContours(). Est-ce exact? Si oui, ce que je fais mal?

  • Quelle est votre question? Que voulez-vous atteindre? Votre code ne correspond pas à la visualisation. cv2.approxPolyDP() retourne la liste de points, et oui, vous êtes en mesure de dessiner une courbe, mais je ne suis pas sûr de savoir comment il traite avec les auto-intersections (qui existent sur votre initiale de la courbe).
  • J'ai mis à jour ma question - comment puis-je tracer le retour liste des points d'une courbe continue, si non, par le biais drawContours?
  • Je ne suis toujours pas sûr de ce que vous dessinez. Vous avez raison, vous devez utiliser drawContours pour les contours du dessin, mais dans votre code vous de les dessiner sur la même toile, et leur montrant une photo, mais vos photos jointes sont différents!!! Pourriez-vous s'il vous plaît poster le code pertinent? Et je suis toujours supposer qu'il peut être en raison de l'auto-intersections. Essayez de dessiner des lignes istead pour essayer de le comprendre.
  • pour obtenir la première image que j'ai commenté le deuxième appel à drawCanvas() et vice-versa. Un sens?
  • Je vois, désolé pour le dérangement. S'il vous plaît essayez de tracer des lignes au lieu de cela, vous verrez les points de l'ordre dans votre rapprochait de contour.
  • quelle est la meilleure façon pour moi de dessiner des lignes? Si j'utilise cv2.polylines(canvas, approx, True, (255, 0, 255)), je reçois essentiellement le même résultat.
  • Laissez-nous continuer cette discussion dans le chat.
  • Essayez d'utiliser convex hull. Exemple d'Application de l'enveloppe Convexe Références: http://opencvexamples.blogspot.com/2013/10/convex-hull.html

InformationsquelleAutor Aidenhjj | 2017-01-26