2016-02-28 237 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 

,它是多边形的无量纲面积。