2016-02-28 239 views
1

我想要計算python 2.7中輪廓線內的區域。它是一個不規則的區域作爲如下:Python:計算不規則輪廓線內的區域

contour_line

基本上,我有保存在以下路徑的輪廓的路徑和I加載:

AoI_saved=np.load('C:\Users\Roberta\Desktop\Analysis\Pilot2\AoI\AoI_Lev1_'+pict[:-4]+'.npy') 

我可以有一個,兩個或更多輪廓保存在同一個文件中。對於由等高線定義的每個區域,我必須計算面積。我從來沒有做過這樣的事情,所以我試圖按照一些教程沒有任何成功。我試過如下:

n_AoI = len(AoI_saved) 
for aa in range(n_AoI): 
    path = (AoI_saved[0][aa].vertices[:,0],AoI_saved[0][aa].vertices[:,1]) 
    print path 
    area = cv2.contourArea(path) 
    print area 

這裏的路徑輸出:

(array([ 731.  , 732.  , 733.  , ..., 730.  , 
    730.07987317, 731.  ]), array([ 445.94074347, 445.88346572, 445.83340569, ..., 446.0051031 , 
    446.  , 445.94074347])) 

,我得到以下錯誤:

TypeError         Traceback (most recent call last) 
<ipython-input-6-e982ceaa0723> in <module>() 
    170    coord = np.array(zip(path[0], path[1])) 
    171 
--> 172    area = cv2.contourArea(path) 
    173    print area 
    174 

TypeError: contour is not a numerical tuple 

我試圖更改代碼如下:

n_AoI = len(AoI_saved) 
for aa in range(n_AoI): 
    path = (AoI_saved[0][aa].vertices[:,0],AoI_saved[0][aa].vertices[:,1]) 
    coord = np.array(zip(path[0], path[1])) 
    print coord  
    area = cv2.contourArea(coord) 
    print area 

座標輸出:

[[[ 731.   445.94074347] 
    [ 732.   445.88346572] 
    [ 733.   445.83340569] 
    ..., 
    [ 730.   446.0051031 ] 
    [ 730.07987317 446.  ] 
    [ 731.   445.94074347]]] 

在這裏,新的錯誤:

error          Traceback (most recent call last) 
<ipython-input-14-354ae41b1566> in <module>() 
    170    coord = np.array(zip(path[0], path[1])) 
    171 
--> 172    area = cv2.contourArea(coord) 
    173    print area 
    174 

error: ..\..\..\..\opencv\modules\imgproc\src\contours.cpp:1904: error: (-215) contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S) in function cv::contourArea 

我的一個問題是,它是不是真的清楚,我cv2.contourArea需要什麼說法?

什麼是計算面積形狀的最簡單方法?

+0

如果它不是強制性的使用openCV,你可以使用勻稱。這很容易,你創建一個幾何體,並且你有一個幾何體的'area'屬性:http://toblerity.org/shapely/shapely.geometry.html – kikocorreoso

+0

不,它不是強制性的。我也會嘗試這種方法!謝謝! – R0bs

+0

我看了一下這個方法!我不清楚你可以使用哪種數據「區域」。我看到很多有調節多邊形的例子,我可以通過頂點或點。就我而言,我總是有一個不規則的數字。你可以幫我嗎? – R0bs

回答

0

你要的數據類型調整爲np.float32 OpenCV的計算輪廓區域:

cv2.contourArea(np.array(path).T.astype(np.float32)) 

path指的是單一路徑,類似於你的問題的代碼的座標。請注意,我在此假設您的數據格式爲((x1, x2, ...), (y1, y2, ...))。如果您有更常見的((x1, y1), (x2, y2), ...)格式,則上述代碼可以在您移除轉置.T時起作用。

+0

非常感謝!它完美的工作!只是要確定; 'data'這裏是我的數據的路徑,不是嗎?我問,因爲看起來,即使面積不是很大,我得到的結果也非常大。 – R0bs

+0

'path'(以前的'data')是指單個路徑的座標,類似於您的問題中的代碼。請注意,我在這裏假定您有格式爲'((x1,x2,...),(y1,y2,...))'的數據。如果你有'((x1,y1),(x2,y2),...)'這個更常見的格式,那麼如果你移除了轉置「.T」,上面的代碼就可以工作。 –

0

工作示例使用勻稱計算多邊形的領域:

from shapely import geometry 

# a square 
poly = geometry.Polygon(((0,0),(0,1),(1,1),(1,0))) 

print(poly.area) 

前面的代碼將打印:

1.0 

,它是多邊形的無量綱面積。