、あなたは格好の良いパッケージを見ていたいことがあります。
http://toblerity.org/shapely/manual.html
格好の良いあなたはポリゴンとの交点を計算することを可能にし、そしてその解決策は非常に簡単取得します:輪郭の重心を通る水平線と垂直線の両方について、輪郭線との交点を計算し、それらの交点に線を引くだけです。
元の図が欠落していますが、私は解決策を示すために楕円を使用しました。あなたはあなたの輪郭のいくつかのサンプル点しか持っていないと言ったので、私はちょっと近似した "粗い"楕円を使用しました。
ソースコードにより、すべての可視化に長いですが、うまくいけば自己説明:
import shapely.geometry as shapgeo
import numpy as np
import cv2
def make_image():
img = np.zeros((500, 500), np.uint8)
white = 255
cv2.ellipse(img, (250, 300), (100,70), 30, 0, 360, white, -1)
return img
if __name__ == '__main__':
img = make_image()
#Create a "coarse" ellipse
_, contours0, hierarchy = cv2.findContours(img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in contours0]
h, w = img.shape[:2]
vis = np.zeros((h, w, 3), np.uint8)
cv2.drawContours(vis, contours, -1, (128,255,255), 1)
#Extract contour of ellipse
cnt = np.vstack([contours[0]]).squeeze()
#Determine centroid
M = cv2.moments(cnt)
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)
cv2.line(vis,(0,cy),(h,cy),(150,0,0),1)
# Calculate intersections using Shapely
# http://toblerity.org/shapely/manual.html
PolygonEllipse= shapgeo.asLineString(cnt)
PolygonVerticalLine=shapgeo.LineString([(cx,0),(cx,w)])
PolygonHorizontalLine=shapgeo.LineString([(0,cy),(h,cy)])
insecv= np.array(PolygonEllipse.intersection(PolygonVerticalLine)).astype(np.int)
insech= np.array(PolygonEllipse.intersection(PolygonHorizontalLine)).astype(np.int)
cv2.line(vis,(insecv[0,0], insecv[0,1]),(insecv[1,0], insecv[1,1]),(0,255,0),2)
cv2.line(vis,(insech[0,0], insech[0,1]),(insech[1,0], insech[1,1]),(0,255,0),2)
cv2.imshow('contours', vis)
0xFF & cv2.waitKey()
cv2.destroyAllWindows()
出力は、これはあなたが探していたものであることを願って、このようになります輪郭が凸であれば、それは比較的単純でなければならない。輪郭内の点によって定義された線分を繰り返します。交点は 'y = cx'と' x = cy'(それぞれ2でなければなりません)で求めます。線をプロットします。凹面であれば、3つ以上の交点を得ることができるので、各軸に対して最も遠い2つを選択する必要があります。 –
残念ながら、私は輪郭のすべての座標を得ることができません。 –