2015-09-23 3 views
2

Я застрял в this учебнике, в котором ROI наклеивается на другую область того же изображения. Python trows ошибка значения, когда я пытаюсь что-то подобное:Копировать и вставить область изображения в opencv?

img = cv2.imread(path, -1) 
eye = img[349:307, 410:383] 
img[30:180, 91:256] = eye 

Exeption:

Traceback (most recent call last): 
    File "test.py", line 13, in <module> 
    img[30:180, 91:256] = eye 
ValueError: could not broadcast input array from shape (0,0,3) into shape (150,165,3) 

Это может быть очень Newb вопроса, но я не мог придумать ответ с помощью функции поиска Google. Существуют ли другие методы numpy для этого?

EDIT: Также в учебнике не указано, как следует вводить координаты. Пример: я могу ввести координаты региона. Я хочу что-то вроде: eye = img[x1:y1, x2:y2] или img[x1:x2, y1:y2]. Это то, что меня смущает. На самом деле я попытался получить эти коорды из метода обратного вызова мыши, который напечатал позицию щелчка мыши. Таким образом, координаты, несомненно, находятся внутри изображения.

ответ

2

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

ValueError: could not broadcast input array from shape (0,0,3) into shape (150,165,3) 

Так глаза, как представляется, имеет размерность (0,0,3) и IMG имеет размерность (150,165,3). 3 соответствует RGB, который представляет собой 3 разных цветовых канала. Итак, ваше оригинальное изображение - 150x165. Но вы попытались выбрать область в img [349: 307, 410: 383]. Я подозреваю, так как область, которую вы указали, находится за пределами изображения, она ничего не выбирает из-за размеров (0,0,3).

Попробуйте импортировать pdb; pdb.set_trace() после второй строки, где вы инициализируете глаз. Это выведет вас на интерактивный терминал python, где вы сможете увидеть, что происходит. Попытайтесь увидеть, какие размеры img есть, и действительно ли это то, что вы хотите. Возможно, загруженное вами изображение меньше, чем пример, вызывающий ошибку.

Обратите внимание на аналогичный вопрос first answer. Ваш метод получения roi выглядит правильно, поэтому попробуйте просто настроить координаты на меньшую область, которая подходит.

+0

TY. Отредактировав вопрос, взгляните. –

+0

Из ответа, с которым я связан, похоже, что вы можете либо сделать: 'img [y1: y2, x1: x2]' или 'img [x1: x2, y1: y2]' – emschorsch

+0

Да, теперь он работает. Благодаря! –

4

Вашего кусочек [349:307, 410:383] возвращает пустой массив eye, которые не могут быть отнесены к мнению массива различной формы .

.: например

In [8]: import cv2 
    ...: fn=r'D:\Documents\Desktop\1.jpg' 
    ...: img=cv2.imread(fn, -1) 
    ...: roi=img[200:400, 200:300] 

In [9]: roi.shape 
Out[9]: (200, 100, 3) 

In [10]: img2=img.copy() 

In [11]: img2[:roi.shape[0], :roi.shape[1]]=roi 

In [12]: cv2.imshow('img', img) 
    ...: cv2.imshow('roi', roi) 
    ...: cv2.imshow('img2', img2) 
    ...: cv2.waitKey(0) 
    ...: cv2.destroyAllWindows() 

Результат:

IMG & рои:

imgroi

img2:

img2

ВНИМАНИЕ, что даже если roi не пустой массив, присваивание с не соответствующей формы будут вызывать ошибки:

In [13]: img2[:100, :100]=roi 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-13-85de95cf3ded> in <module>() 
----> 1 img2[:100, :100]=roi 

ValueError: could not broadcast input array from shape (200,100,3) into shape (100,100,3) 
+0

как вы можете поместить его в другое место? как x = 10 и y = 30 –

0
img[349:307, 410:383] 

просит переводчика, чтобы найти все значения х выше 349 и ниже 307, который невозможно и вернет размер среза 0. Поверните свои номера.

img[307,349, 383:413] 

Также ваши измерения ошибочны. Как вы можете поместить кусочек ширины 42 в кусочек ширины 150?

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