2014-08-14 2 views
0

Я ищу способ определения основных фигур из изображения с использованием открытого CV в Python.Обнаружение основных фигур с использованием Open CV

Это код, который я использовал для обнаружения основных изображений, который работает:

import numpy as np 
import cv2 
import webbrowser 

img = cv2.imread('test3.png') 
gray = cv2.imread('test3.png',0) 

ret,thresh = cv2.threshold(gray,127,255,1) 

contours,h = cv2.findContours(thresh,1,2) 

for cnt in contours: 
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True), True) 
    print len(approx) 
    if len(approx)==5: 
    print "It's a pentagon = mortgages." 
    webbrowser.open('http://www.google.co.uk') 
    #cv2.drawContours(img,[cnt],0,255,-1) 
elif len(approx)==3: 
    print "triangle" 
    cv2.drawContours(img,[cnt],0,(0,255,0),-1) 
elif len(approx)==4: 
    print "square" 
    cv2.drawContours(img,[cnt],0,(0,0,255),-1) 
elif len(approx) == 9: 
    print "half-circle" 
    cv2.drawContours(img,[cnt],0,(255,255,0),-1) 
elif len(approx) > 15: 
    print "circle" 
    cv2.drawContours(img,[cnt],0,(0,255,255),-1) 

#cv2.imshow('img',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Однако выводит результат в два раза. Любой совет или пример, чтобы исправить это, будет очень признателен.

+2

Что именно вы подразумеваете под * "выводит результат дважды" *? Просмотрите отступ в коде, это важно в Python. – jonrsharpe

+0

, если у вас есть что-то вроде линейного треугольника (а не объекта, но контура) с другим цветом, чем фон, вы в итоге найдете два контура, один внутри и один на внешней стороне этих линий. Поскольку KeillRandor предлагает вам использовать параметры, чтобы найти только внешний контур, но в этом случае вы можете пропустить другие фигуры внутри этого контура (если, например, разрешен круг внутри квадрата). Возможно, вы можете просто отфильтровать удвоенные фигуры, если у вас есть знания о размере линии. Или вы можете попытаться вычислить «внутренние» контуры в дальнейших шагах. – Micka

ответ

0

Если вы хотите получить только Outter контуры объекта, добавить правильный флаг cv2.findContours:

contours,h = cv2.findContours(thresh,cv2.RETR_EXTERNAL,2) 

в противном случае он может возвращать более одного контура в форме, следовательно, повторный результат в цикле for ,

Надеюсь, что это поможет.

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