2015-11-27 3 views
0

Я использую opencv для python. Для плохой формы мы используем approxpolyDP(). Для этого я создал плохой прямоугольник (добавлен в сообщение)Ориентация контура OpenCV

При использовании этого я получаю только 2 точки, а не правильный прямоугольник.

Может ли кто-нибудь помочь мне, почему это происходит?

import cv2 
import numpy as np 

im = cv2.imread("badrect.png") 
img = im 
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
canny = cv2.Canny(img,100,200) 


(_,cnts,_) = cv2.findContours(canny,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) 

cnt = cnts[0] 

epsilon = 0.1*cv2.arcLength(cnt,True) 
approx = cv2.approxPolyDP(cnt,epsilon,True) 

cv2.drawContours(im,approx,-1,(0,255,0),3) 

cv2.imshow("img",im) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Вот как выглядит результат. Bad rectangle Это как я хочу, чтобы это было как desired output

Заранее спасибо! :)

ответ

0

проблемы заключаются в следующем:

(1) image настолько плохо, что я должен уменьшить arcLength()*0.08 вместо arcLength()*0.1;

(2) вы путаете im и img, будьте осторожны.

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

path = "/Users/summing/Desktop/skM2L.jpg" 
img = cv2.imread(path) 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

(ret, thresh) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
edge = cv2.Canny(thresh, 100, 200) 
(cnts, _) = cv2.findContours(edge.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 


total = 0 
for c in cnts: 
    epsilon = 0.08 * cv2.arcLength(c, True) 
    approx = cv2.approxPolyDP(c, epsilon, True) 

    cv2.drawContours(img, [approx], -1, (0, 255, 0), 4) 
    total += 1 

print "I found {0} RET in that image".format(total) 
cv2.imshow("Output", img) 
cv2.waitKey(0) 
exit() 

И код работает для меня. Надеюсь, это поможет. Вот result.

+0

_ УНТ = cv2.findContours (edge.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ValueError: слишком много значений для распаковки (ожидается 2) Как решить это !!! – venkat

1

Использовать примерно как массив. Надеюсь, это поможет.

cv2.drawContours(im,[approx],-1,(0,255,0),3) 
+0

Полезно объяснить, почему и как ваш ответ решает проблему оригинального плаката. – cb4

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