2016-04-08 6 views
3

Ich habe ein Bild mit zwei Konturen, wobei eine Kontur immer 'innen' ist. Ich möchte den Abstand zwischen den beiden Konturen für 90 verschiedene Winkel (Bedeutung, Abstand alle 4 Grad) finden. Wie gehe ich vor?Wie finde ich den Abstand zwischen zwei konzentrischen Konturen für verschiedene Winkel?

Hier ist ein Beispiel Bild:

enter image description here

Thank you!

+0

Werfen Sie einen Blick auf die wohlgeformten Paket und diese Antwort: http://stackoverflow.com/questions/36314240/how-to-draw-a-line-from-the-centroid- von Kontur zu Umfang-der-contou/36412705 # 36412705 – tfv

+0

Darf ich nicht annehmen, dass ich die Koordinaten des Umfangs beider Konturen habe? Weil ich nicht. Ich habe mich tatsächlich auf diese Antwort bezogen, bevor ich das fragte. Ich möchte grundsätzlich den Abstand vom Umfang einer Kontur zu der einer anderen für verschiedene Winkel messen. –

+0

1.) Sie nehmen die innere Kontur und berechnen den Schwerpunkt. 2.) Für jeden Winkel erstellen Sie eine Linie. 3.) Für jede Linie berechnen Sie die Schnittpunkte mit beiden Konturen, wie im anderen Beispiel gezeigt. Habe ich etwas verpasst? – tfv

Antwort

1

Im folgenden Code habe ich Ihnen gerade das Beispiel für die vertikale Linie gegeben, der Rest kann durch Drehen der Linie erhalten werden. Das Ergebnis sieht folgendermaßen aus: Anstatt zu zeichnen, können Sie die Koordinaten für die Abstandsberechnung verwenden.

enter image description here

import shapely.geometry as shapgeo 
import numpy as np 
import cv2 


img = cv2.imread('image.jpg', 0) 
ret, img =cv2.threshold(img, 128, 255, cv2.THRESH_BINARY) 

#Fit the ellipses 
_, contours0, hierarchy = cv2.findContours(img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
outer_ellipse = [cv2.approxPolyDP(contours0[0], 0.1, True)] 
inner_ellipse = [cv2.approxPolyDP(contours0[2], 0.1, True)] 

h, w = img.shape[:2] 
vis = np.zeros((h, w, 3), np.uint8) 
cv2.drawContours(vis, outer_ellipse, -1, (255,0,0), 1) 
cv2.drawContours(vis, inner_ellipse, -1, (0,0,255), 1) 

##Extract contour of ellipses 
cnt_outer = np.vstack(outer_ellipse).squeeze() 
cnt_inner = np.vstack(inner_ellipse).squeeze() 

#Determine centroid 
M = cv2.moments(cnt_inner) 
cx = int(M['m10']/M['m00']) 
cy = int(M['m01']/M['m00']) 
print cx, cy 

#Draw full segment lines 
cv2.line(vis,(cx,0),(cx,w),(150,0,0),1) 

# Calculate intersections using Shapely 
# http://toblerity.org/shapely/manual.html 
PolygonEllipse_outer= shapgeo.asLineString(cnt_outer) 
PolygonEllipse_inner= shapgeo.asLineString(cnt_inner) 
PolygonVerticalLine=shapgeo.LineString([(cx,0),(cx,w)]) 


insecouter= np.array(PolygonEllipse_outer.intersection(PolygonVerticalLine)).astype(np.int) 
insecinner= np.array(PolygonEllipse_inner.intersection(PolygonVerticalLine)).astype(np.int) 
cv2.line(vis,(insecouter[0,0], insecinner[1,1]),(insecouter[1,0], insecouter[1,1]),(0,255,0),2) 
cv2.line(vis,(insecouter[0,0], insecinner[0,1]),(insecouter[1,0], insecouter[0,1]),(0,255,0),2) 

cv2.imshow('contours', vis) 

0xFF & cv2.waitKey() 
cv2.destroyAllWindows() 
Verwandte Themen