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.
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()
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
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. –
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