Вместо использования small = cv2.resize(...)
вы можете передать объект вывода по ссылке: cv2.resize(big, (w, h), small)
.
Не могу сказать, что действительно понимаю, что происходит под капотами, но я почти уверен, что для повторного использования предварительно выделенного Python объекта для изменения размера можно использовать следующий метод:
# Pre-allocate object (assume output format is uint8 BGR):
small = np.zeros((small_height, small_width, 3), np.uint8)
# Pass output ndarray by reference:
cv2.resize(big, (small_width, small_height), small)
Примечание:
Соглашение OpenCV - (width, height)
, а не (height, width)
, как в вашем примере кода.
Обновление:
На самом деле просто проверить, создает ли cv2.resize
новый объект или повторно использует существующий.
Вот простой тест, который показывает, что OpenCV повторно использует существующий объект:
import cv2
import numpy as np
big = cv2.imread('chelsea.png', cv2.IMREAD_COLOR)
small_width, small_height = 160, 90
# Allocate as twice as much rows (allocate small_height*2 rows istead of small_height rows)
small = np.zeros((small_height*2, small_width, 3), np.uint8)
small[:, :, 1] = 255 # Fill small image with green color
small_slice = small[small_height//2:small_height*3//2, :, :] #Get a slice in the expected size of resized output
# Pass small_slice by reference
cv2.resize(big, (small_width, small_height), small_slice)
cv2.imshow('small', small)
cv2.waitKey(0)
cv2.destroyAllWindows()
Результат:
Как видите, зеленый цвет сохраняется от исходного объекта, а срез заполняется выводом resize
.