2015-07-17 2 views
1

Я работал над примером поиска и рисования контуров в opencv python. Но когда я запускаю код, я вижу только темное окно без контуров. Я не знаю, где я ошибаюсь. Код:DrawContours() не работает opencv python

import numpy as np 
import cv2 
im = cv2.imread('test.png') 
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(imgray,127,255,0) 
image, contours, hierarchy =  cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
img=cv2.drawContours(image,contours,0,(0,255,0),3) 
cv2.imshow('draw contours',img) 
cv2.waitKey(0) 

test.png просто белый прямоугольник в черном фоне.

Любая помощь будет оценена по достоинству.

Edit: Я использую OpenCV 3.0.0 и Python 2.7

+2

Попробуйте сохранить изображение на этапе 'ret, thresh = cv2.threshold (imgray, 127,255,0)', чтобы увидеть, есть ли какие-либо контуры. Если вы его не видите, то, вероятно, он не найдет. Возможно, вам придется настроить параметр порога, пока не увидите контуры. – Ryan

+2

или проверьте, не опущены ли контуры перед его рисованием. Чтобы нарисовать все контуры, вы также должны зацикливаться на контурах и рисовать их. – Miki

+1

как насчет отправки 'test.png', чтобы мы могли воспроизвести проблему? – galath

ответ

2

Я считаю, что проблема с командой drawContours. Как и в настоящее время, назначение изображения равно image и img. Вы также пытаетесь нарисовать цветную рамку на одноканальном 8-битном изображении. Кроме того, стоит отметить, что функция findContours фактически изменяет входное изображение в процессе нахождения контуров, поэтому лучше не использовать это изображение в более позднем коде.

Я бы также рекомендовал создать новую копию изображения для назначения в качестве пункта назначения для функции drawContours, если вы планируете провести дальнейший анализ изображения, чтобы не писать по единственной копии, к которой у вашей программы в настоящее время имеется доступ.

import numpy as np 
import cv2 

im = cv2.imread('test.png') 
imCopy = im.copy() 
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(imgray,127,255,0) 
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
cv2.drawContours(imCopy,contours,-1,(0,255,0)) 
cv2.imshow('draw contours',imCopy) 
cv2.waitKey(0) 

Эти две быстрые исправления работали для меня на аналогичном изображении черного квадрата с белым фоном.

+0

Это сработало и для меня! Спасибо за четкое объяснение. – Nil

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