2013-12-13 5 views
0

Я встречаю странное поведение, и, хотя я могу обойти его, я хотел бы знать, почему это так.Opencv: cv2.findContours изменяет изображение, которое уже было построено?

Когда я использую cv2.findContours, он изменяет исходное изображение, даже если я не передал его функции. Вот минимальный пример, где изображение можно найти here.

import matplotlib.pyplot as plt 
import cv2 

img =cv2.imread('a.jpg',0) 
a1=plt.subplot(121) 
plt.imshow(img, cmap='Greys') 

ret, thresh = cv2.threshold(img,57,255,cv2.THRESH_BINARY) 

a1=plt.subplot(122) 
plt.imshow(thresh, cmap='Greys') 
plt.show() 

temp=thresh 
del thresh 

contours, hierarchy = cv2.findContours(temp,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

Когда я прокомментирую строку cv2.findContours, она отлично работает. Почему это?

+0

В вашем коде как temp, так и thresh - это тот же объект. temp - это просто другой взгляд на thresh, а не на копию. поместите 'temp = thresh.copy()'. Это решит проблему. –

+0

Спасибо, что заставляет работать! Но модификация должна произойти после того, как я ее построил, не так ли? Почему это изменяет сюжет? –

+0

Я думаю, что .imshow нужно некоторое время и может произойти в фоновом потоке, поэтому изменение изображения в процессе построения графика может изменить (незавершенный) сюжет. Можете ли вы добавить 'waitKey (30)' за imshow или эквивалент python для waitKey (не знаете синтаксис python)? – Micka

ответ

2

Это происходит потому, что tempявляетсяthresh. В python, когда вы выполняете такое задание, вы не справляетесь с объектом, вы просто делаете новую ссылку. Взгляните на модуль copy, чтобы достичь своей цели.

+0

Спасибо, что заставляет работать! Но модификация должна произойти после того, как я ее построил, не так ли? Почему это изменяет сюжет? –

+1

Не знаю. Сюжет не изменится для меня, по крайней мере, с помощью кода, который вы вставили. – smeso

+0

Внимательный, поэтому он, вероятно, имеет какое-то отношение к моей окружающей среде. Спасибо за помощь! –

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