OpenCV и Python – Как накладывать изображения, задавая координаты?

Короче говоря, мой вопрос: как поместить изображение поверх другого, указав конкретные координаты для добавленного изображения? Мне нужно было бы расширить «холст» базового изображения по мере необходимости, чтобы добавленное изображение не обрезалось.

Вот расширенная версия:

Мой проект состоит в том, чтобы делать снимки, извлеченные из видеоролика, и делать с ними грубую карту, выравнивая одну фотографию с последней. Я знаю, что есть программное обеспечение, которое я могу использовать для этого, например, Agisoft Photoscan, но моя цель – создать более легкое, грубое решение.

Итак, вот мой план, который я намерен делать с каждым фреймом:

  1. Используйте curr_photo , чтобы сгенерировать матрицу преобразования для выравнивания curr_photo с последней фотографией, base
  2. Вычислите ограничивающий прямоугольник, необходимый для приложения полученного изображения (с использованием преобразований четырех углов)
  3. Измените матрицу преобразования так, чтобы левая верхняя граница ограничительной рамки находилась в начале координат
  4. Примените преобразование к текущей фотографии, используя ширину и высоту ограничивающего прямоугольника, чтобы гарантировать, что ни одно из полученных изображений не будет обрезано
  5. Супер-навязать текущее изображение последним изображением (убедитесь, что нет обрезки любого изображения), добавив curr_image для base в правильных координатах. Этот шаг – это то, о чем я прошу.

Вот код, который делает шаги от одного до четырех.

 import numpy as np import cv2 base = cv2.imread("images/frame_03563.jpg") curr_photo = cv2.imread("images/frame_03564.jpg") height, width = curr_photo.shape[:2] # Step 1 # which transformation is required to go from curr_photo to base? transformation = cv2.estimateRigidTransform(curr_photo, base, True) # Step 2 # add a line to the affine transformation matrix so it can be used by # perspectiveTransform three_by_three = np.array([ transformation[0], transformation[1], [0, 0, 1]], dtype="float32") # get corners of curr_photo (to be transformed) corners = np.array([ [0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1] ]) # where do the corners of the image go trans_corners = cv2.perspectiveTransform(np.float32([corners]), three_by_three) # get the bounding rectangle for the four corner points (and thus, the transformed image) bx, by, bwidth, bheight = cv2.boundingRect(trans_corners) # Step 3 # modify transformation matrix so that the top left of the bounding box is at the origin transformation[0][2] = transformation[0][2] - bx transformation[1][2] = transformation[1][2] - by # Step 4 # transform the image in a window the size of its bounding rectangle (so no cropping) mod_curr_photo = cv2.warpAffine(curr_photo, transformation, (bwidth, bheight)) # for viewing cv2.imshow("base", base) cv2.imshow("current photo", curr_photo) cv2.imshow("image2 transformed to image 1", mod_curr_photo) cv2.waitKey() 

Я также добавил два образца изображений. Я использовал первую в качестве базы, но она работает в любом случае.

База

Текущий

One Solution collect form web for “OpenCV и Python – Как накладывать изображения, задавая координаты?”

Изменить : теперь я включил ответ, приведенный ниже, в модуль Python, который вы теперь можете взять с GitHub здесь .


Я ответил на этот вопрос несколько недель назад . Ответ должен содержать все необходимое для выполнения того, что вам нужно; единственное, что я не обсуждаю, – это альфа-смешивание или другие методы, которые сочетают границы изображений вместе, как с панорамой или подобным.

Чтобы не обрезать искаженную фотографию, вам нужно заранее рассчитать требуемую прокладку, потому что сама по себе изображение может ссылаться на отрицательные индексы, и в этом случае она не будет их рисовать … поэтому вам сначала нужно вычислить местоположения основы, достаточно, чтобы учитывать те индексы, которые находятся за пределами ваших границ изображения, а затем модифицируйте матрицу деформации, чтобы добавить эти переводы, чтобы они были деформированы до положительных значений.

Это позволяет создать изображение следующим образом:

Смешанное, деформированное, мягкое изображение

Изображение из VGG Оксфорда .

  • Несоответствие результатов между cv.MinAreaRect2 и ArcGIS (программное обеспечение ГИС). Возможная ошибка?
  • Чтобы получить координаты в линии красного цвета
  • Как записывать видео с помощью OpenCV и Python?
  • Веб-камера: libv4l2 & VIDIOC_DQBUF: нет такого устройства
  • Проблема с Opencv и Python
  • Обнаружение формы в python с использованием OpenCV
  • Python - текстовое изображение распознавания
  • K-средство в интерфейсе Python OpenCV
  • Python - лучший язык программирования в мире.