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 Оксфорда .

  • ** SOLVED ** Как включить libgtk2.0-dev и pkg-config в cmake при установке openCV на Ubuntu 16
  • OpenCV cv2.fillPoly vs. cv2.fillConvexPoly: ожидаемый тип данных для массива многоугольных вершин?
  • Простое распознавание знаков OCR в OpenCV-Python
  • Поворот изображения и обрезка черных границ
  • Система сдвинутых изображений Numpy
  • Книги для OpenCV и Python?
  • Разница между «import cv» и «import opencv.cv» с использованием Python + OpenCV?
  • Как просматривать видеопоток в OpenCV2 python
  • Разница в opencv hog-дескрипторе, вычисленная в python и c ++
  • Отображение функции C ++ на основе OpenCV с преобразованием Mat / Numpy в Python
  • Утечка памяти с помощью VideoCapture в Python OpenCV
  •  
    Interesting Posts for Van-Lav

    Python – экранирование двойных кавычек с использованием string.replace

    Создание уникальных перестановок в Python

    Как поддерживать только узлы в networkx-graph с 2+ исходящими ребрами или 0 исходящими ребрами?

    В чем разница между этими двумя решениями – лямбда или петля – Python

    Python GTK + webkit – вставить JavaScript после gtk.main ()

    Как интерактивно отображать и скрывать строки в сюжете Боке?

    Как использовать API Google Map Feed для получения списка моих Карт Google с помощью Python?

    syncdb игнорирует импортированные модели

    Будут ли обрабатывать бутылки без параллелизма?

    Веб-сервер Python: как обслуживать запросы асинхронно

    Поле выбора модели Django – зависит от выбора другого поля

    Когда использовать возврат (что-то вывести)?

    Weird equal sign "=" вставляет в значение <textarea> при загрузке файла через POST с помощью blobstore_handlers.BlobstoreUploadHandler в Google App Engine

    Чтение данных файла Unicode с символами спецификации в Python

    Словарь как таблица в шаблоне Django

    Python - лучший язык программирования в мире.