OpenCV: объединение двух изображений с помощью OpenCV

Каков наилучший способ сделать размер поля 2 равным Box 1, чтобы CvCopy(); может быть применено:

РЕДАКТИРОВАТЬ:

Возможно, я не правильно поставил вопрос. Поэтому я перефразирую это. Учитывая изображение 2 (как показано выше), я хочу преобразовать его, как показано ниже:

По сути, я должен добавить черную рамку через него. изменение размера не будет работать, так как мое изображение будет искажено. Другими словами, я должен добавить нули в определенную толщину вокруг изображения.

Также, хотя показано пустым, эти изображения (коробки) могут иметь некоторые объекты внутри них, которые я не показывал.

2 ответа

Решение

Ты можешь использовать copyMakeBorder Функция для этого. Я не знаю dotnet, ниже приведен пример кода на Python. Также посетите документы для вышеупомянутой функции: DOCS

Сначала загрузите два изображения. imb это большое изображение, и ims это маленькое изображение.

import cv2
import numpy as np

imb = cv2.imread('messi4.jpg')
ims = cv2.imread('template.jpg')

Теперь позвольте rb,cb быть количеством строк и столбцов большого изображения, а так же rs,cs для маленького изображения.

rb,cb = imb.shape[:2]
rs,cs = ims.shape[:2]

Наконец, чтобы использовать copyMakeBorder функция, вам нужно количество строк и столбцов, которые будут добавлены сверху, снизу, слева и справа. Поэтому нам нужно их найти.

top = (rb-rs)/2
bottom = rb - rs - top
left = (cb-cs)/2
right = cb - cs - left

Наконец примените функцию.

res = cv2.copyMakeBorder(ims,top,bottom,left,right,cv2.BORDER_CONSTANT)

Теперь посмотрим на результаты:

Исходное маленькое изображение:

Модифицированный новый образ:

Он имеет тот же размер, что и мое большое изображение (здесь не показывалось, думал, что в этом нет необходимости, если хотите, я могу загрузить)

Расширение меньшего не будет лучшей идеей, поскольку вы получите много искажений изображения - скорее было бы лучше уменьшить большее, если окончательный размер не является проблемой.

Вы можете изменить размер изображения, используя cv::resize( ) (это функция C++ - я не использовал OpenCV dot net).

Детали реализации находятся в API.

С точки зрения слияния, это зависит от вашего определения, но просто с помощью cv::copy( ) не буду этого делать Здесь есть полное руководство по слиянию изображений в документации.

Другие вопросы по тегам