cv2 конвертирует функции Range и copyTo из c ++ в python - PullRequest
0 голосов
/ 27 января 2019

Я пишу видеостабилизатор Python, и в какой-то части кода мне нужно скопировать 2 изображения на холст.

Я пытался преобразовать этот код C ++ в Python, но я не смог.

Mat cur2;

warpAffine(cur, cur2, T, cur.size());

cur2 = cur2(Range(vert_border, cur2.rows-vert_border), 
Range(HORIZONTAL_BORDER_CROP, cur2.cols-HORIZONTAL_BORDER_CROP));

// Resize cur2 back to cur size, for better side by side comparison
resize(cur2, cur2, cur.size());

// Now draw the original and stablised side by side for coolness
Mat canvas = Mat::zeros(cur.rows, cur.cols*2+10, cur.type());

cur.copyTo(canvas(Range::all(), Range(0, cur2.cols)));
cur2.copyTo(canvas(Range::all(), Range(cur2.cols+10, cur2.cols*2+10)));

Я написал этот код, но получил ошибку:

ret, frame = cap.read()
new_frame = transform(frame,data[counter]) #some kind of low pass filter

canvas = np.zeros ((frame_height, frame_width*2+10,3))
np.copyto (canvas[:frame_width], frame)
np.copyto (canvas[frame_width+10:frame_width*2+10], new_frame)

Я получил

"не может boradcast из формы в форму"

ERR. Но я думаю, что использовал холст неправильно. в коде cpp есть canvas(Range::all(), Range(0, cur2.cols)), который я не знаю, как использовать его в python

Как я могу использовать функцию Range и функцию copyTo в python? И как мне скопировать изображение в определенную часть холста?

Любая помощь?

1 Ответ

0 голосов
/ 27 января 2019

cv :: Mat на самом деле являются массивами в Python. И в этом случае вы должны использовать функции NumPy, а не OpenCV.

Для copyTo в качестве клона используйте copy () как в:

a = np.zeros((10,10,3), dtype=np.uint8)
b = a.copy()

Для диапазонов, в numpy проще ... просто используйте:

a[y1:y2, x1:x2,:]

, что означает от строки y1 до строки y2 и от столбца x1 до столбца x2. Если вам нужно все, просто оставьте : один, как и все строки:

a[:, x1:x2,:]

Последнее двоеточие для каналов, в данном случае для всех каналов, но вы также можете ограничить его. И если вам нужен только 1 столбец или канал, вы можете указать число напрямую, а не использовать «диапазон», такой как

a[4, x1:x2, 0]

Вы также можете удалить последний двоеточие каналов, и он будет использовать все из них. Как:

a[1:3, 4:8]

Наконец, чтобы скопировать значение в место на изображении, вы можете сделать что-то вроде:

bigImage[y1:y2, x1:x2] =  image

Вы должны убедиться, что изображение вписывается в это место (включая каналы). Это означает, что если изображение имеет размер 640x480, вы не можете сделать это:

bigImage[10:20, 20:30] =  image

но вы можете сделать что-то вроде

bigImage[10:20, 20:30] =  image[10:20, 10:20]

при условии, что оба имеют одинаковое количество каналов

...