Python:计算不规则轮廓线内的区域

时间:2016-02-28 10:54:15

标签: python opencv

我正在尝试计算python 2.7中轮廓线内的Area。这是一个不规则的区域如下:

contour_line

基本上,我在下面的路径中保存了轮廓的路径,然后加载它:

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

Coord输出:

[[[ 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采用什么参数?

计算区域形状的最简单方法是什么?

2 个答案:

答案 0 :(得分:0)

您必须将opencv的数据类型调整为np.float32才能计算轮廓区域:

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

path指的是单个路径的坐标,类似于问题中的代码。请注意,我在此假设您拥有格式为((x1, x2, ...), (y1, y2, ...))的数据。如果您使用更常见的((x1, y1), (x2, y2), ...)格式,则在删除转置.T时,上述代码会有效。

答案 1 :(得分:0)

使用shapely计算多边形区域的工作示例:

from shapely import geometry

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

print(poly.area)

之前的代码将打印出来:

1.0

它是多边形的无单位区域。