Я пытаюсь реализовать warpperspect функцию из opencv вручную.
Моя интерпретация Warpperspective такова:
- Применить гомографию к каждому
[x,y,1]
в исходном изображении, чтобы получить [x'/a y'/a a]
- Для каждого
[x'/a y'/a]
координату в целевом изображении, замените значение пикселя (интенсивность) значением пикселя [x y]
координата в исходном изображении.
Но я получаю слишком большие x'/a y'/a
значения, которые выходят за границы для background
Я знаю, что делаю что-то не так, но не знаю что.
import cv2
import numpy as np
img = cv2.imread('cola.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
background = cv2.imread('stadium.jpg')
background = cv2.cvtColor(background,cv2.COLOR_BGR2RGB)
row,col,ch=img.shape
print(row)
print(col)
print(ch)
print("bbb",img[0,0,0])
rows_p,cols_p,ch_p = background.shape
print(rows_p)
print(cols_p)
print(ch_p)
pts1 = np.float32([[0,0],[974,0],[0,974],[974,974]]) # cola coords
pts2 = np.float32([[560,383],[940, 516],[5,527],[298,733]]) # stadium tile coords
M = cv2.getPerspectiveTransform(pts1,pts2)
print(M)
Store_Matrix=np.empty([3,1])
for i in range(row):
for j in range(col):
Store_Matrix=np.dot(M,img[i,j])
X=Store_Matrix[0].astype(int)
Y=Store_Matrix[1].astype(int)
background[X,Y,1]=img[i,j,1]
background[X,Y,2]=img[i,j,2]
background[X,Y,3]=img[i,j,3] # trying to take the pixel vale from the source image for every channel and replacing the pixel value in the backgroung image (the new coordinates after applying homo)graphy