2016-03-16 2 views
0

SHORTOpenCV putText в Python - Ошибка после манипуляции массива

Я хочу написать текст в изображение. Я, однако, не в состоянии понять следующее поведение:

import numpy as np 
import cv2 
# create an image 
img = np.ones((512,512,3), dtype = np.uint8) 
# create an image container (I have to do this as I cycle through many folder and collect images) 
img_container = np.zeros((512,512,3,5), dtype = np.uint8) 
# send img to the container array 
img_container[:,:,:,0] = img[:,:,:] 

# I can add text to the original image 
cv2.putText(img, 'Hello World', (10,500), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255),2) 
cv2.imshow('img', img) 

# When I retrieve the img again.. 
img_from_container = img_container[:,:,:,0] 
# ..I am unable to do so however 
cv2.putText(img_from_container, 'Hello World', (10,500), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255),2) 

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) 

LONG

Я не понимаю разницу между этими двумя переменными (IMG и img_from_container), поскольку они оба dtype = np.uint8, они оба имеют такая же форма при тестировании img.shape, и когда я сравниваю их с img==img_from_container, я получаю все это.

Очевидно, что я чего-то не хватает. Я был бы очень благодарен за любые намеки и предложения о том, где еще эти две переменные отличаются!

ответ

3

Изменения следующей строки решает проблему

img_from_container = img_container[:,:,:,0].copy() 

np.copy() проясняет сделать еще одну копию данных, то OpenCV есть возможность написать этот массив. Предыдущий код получает представление из массива с большими размерами, где putText() не удалось изменить.

+0

Это ответ, который я искал. Спасибо, также за четкое объяснение! – dtadres

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