Повторно использовать предварительно выделенный объект OpenCV Mat / Python для изменения размера - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь изменить размер объекта Mat изображения OpenCV до меньшего размера, как показано ниже:

small = cv2.resize(big, (small_height, small_width))

Это прекрасно работает, однако в конечном итоге каждый раз создается новый маленький объект OpenCV Mat. строка кода называется.

Поэтому я пытаюсь найти способ избежать создания нового маленького объекта Mat каждый раз. У кого-нибудь есть идея, возможно ли вообще использовать предварительно выделенный объект Mat для вывода изменения размера?

1 Ответ

2 голосов
/ 16 февраля 2020

Вместо использования 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()

Результат:
enter image description here

Как видите, зеленый цвет сохраняется от исходного объекта, а срез заполняется выводом resize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...