2016-03-30 19 views
2

私はそうのようなモーメントを用いて輪郭の重心を得ている:輪郭の重心から輪郭の周囲に線を引く方法は?

cnt = np.vstack([cnt[0]]).squeeze() 
M = cv2.moments(cnt) 
cx = int(M['m10']/M['m00']) 
cy = int(M['m01']/M['m00']) 

私はそれを描画する2つの行を必要とするであろうように、両方の、4つの象限に垂直一方と水平方向のいずれかの輪郭を分割します得られた重心を通過する。それをどうやってやるの?これは、OpenCVのための作業のように見えますが

+0

出力は、これはあなたが探していたものであることを願って、このようになります輪郭が凸であれば、それは比較的単純でなければならない。輪郭内の点によって定義された線分を繰り返します。交点は 'y = cx'と' x = cy'(それぞれ2でなければなりません)で求めます。線をプロットします。凹面であれば、3つ以上の交点を得ることができるので、各軸に対して最も遠い2つを選択する必要があります。 –

+0

残念ながら、私は輪郭のすべての座標を得ることができません。 –

答えて

1

、あなたは格好の良いパッケージを見ていたいことがあります。

http://toblerity.org/shapely/manual.html

格好の良いあなたはポリゴンとの交点を計算することを可能にし、そしてその解決策は非常に簡単取得します:輪郭の重心を通る水平線と垂直線の両方について、輪郭線との交点を計算し、それらの交点に線を引くだけです。

元の図が欠落していますが、私は解決策を示すために楕円を使用しました。あなたはあなたの輪郭のいくつかのサンプル点しか持っていないと言ったので、私はちょっと近似した "粗い"楕円を使用しました。

enter image description here

ソースコードにより、すべての可視化に長いですが、うまくいけば自己説明:

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