Перспективная проекция с гомографией не работает - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь заменить правую боковую дорогу следующего изображения на светло-желтый многоугольник:

происхождение : enter image description here

желательно (создано вручную): enter image description here

Так что я думаю использовать Гомографию , чтобы это произошло (я знаю, что просто добавление заполненного многоугольника тоже будет работать, но я могу использовать другие исходные изображения, кроме простого желтого полигон, такой как рекламные картинки в будущем). Это учебник , и я просто скопировал в него код и внес некоторые изменения в пиксели. Исходное изображение, которое я использую, выглядит следующим образом:

enter image description here

И первое изображение в этом посте - это изображение моего назначения.

Вот мой код для выполнения работы:

import cv2
import numpy as np

# source image
source_img = cv2.imread('lightyellow.jpg')
# get four corners of the source (clock wise)
pts_source = np.array([[0,0], [20,0], [20,30],[0,30]])

# destination image
dst_img = cv2.imread('0.png')
# four corners in destination image (also clock wise):
pts_dst = np.array([[292,0], [415,0], [578,120],[415,189]])

# calculate homography
h, status = cv2.findHomography(pts_source, pts_dst)

# warp source image to destination based on homography
img_out = cv2.warpPerspective(source_img, h, (dst_img.shape[1], dst_img.shape[0]))

cv2.imshow('warped', img_out)
cv2.waitKey(0)

Однако то, что я получил, выглядит примерно так:

enter image description here

Это совершенно неправильно, но я не знаю почему. Может ли кто-нибудь дать мне инструкцию?

1 Ответ

0 голосов
/ 30 июня 2018

Я наконец сделал это со следующим кодом:

import cv2
import numpy as np

# source image
source_img = cv2.imread('lightyellow.jpg')
size = source_img.shape
# get four corners of the source (clock wise)
pts_source = np.array(
                    [
                    [0,0],
                    [size[1] - 1, 0],
                    [size[1] - 1, size[0] -1],
                    [0, size[0] - 1 ]
                    ],dtype=float
                    )
#pts_source = np.array([[310,0], [440,0], [589,151],[383,151]])

# destination image
dst_img = cv2.imread('0.png')
# four corners in destination image (also clock wise):
pts_dst = np.array([[292,0], [409,0], [577,191],[421,193]])

# calculate homography
h, status = cv2.findHomography(pts_source, pts_dst)

# warp source image to destination based on homography
temp = cv2.warpPerspective(source_img, h, (dst_img.shape[1], dst_img.shape[0]))

# Black out polygonal area in destination image.
cv2.fillConvexPoly(dst_img, pts_dst.astype(int), 0, 16)

# Add warped source image to destination image.
dst_img = dst_img + temp

cv2.imshow('warpped', dst_img)
cv2.waitKey(0)
...