我正在尝试计算python 2.7中轮廓线内的Area。这是一个不规则的区域如下:
基本上,我在下面的路径中保存了轮廓的路径,然后加载它:
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
采用什么参数?
计算区域形状的最简单方法是什么?
答案 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
它是多边形的无单位区域。