2016-02-28 4 views
1

Я пытаюсь вычислить область внутри контурной линии в python 2.7. Это нерегулярная область, как следует:Python: вычислить область в пределах нерегулярной контурной линии

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 

Координатный выход:

[[[ 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

Я взглянул на этот метод! Мне непонятно, какие данные вы можете использовать «область». Я видел много примеров с regulat polygons, где я могу передавать вершины или некоторые точки. В моем случае у меня всегда нерегулярная фигура. Вы можете мне помочь? – 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

Спасибо большое! Он отлично работает! Просто чтобы быть уверенным; «данные» здесь - путь моих данных, не так ли? Я спрашиваю, потому что кажется, что результаты, которые я получаю, действительно большие, даже если область не очень большая. – 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 

Что это безразмерная площадь многоугольника.

Смежные вопросы