求原位置的点经过透视变换后的位置
import numpy as np
from regex import P
np.set_printoptions(suppress=True)
from shapely.geometry import Point,Polygon#,MultiPoint #多边形
import matplotlib.pyplot as plt
import cv2
#对应的原始四个点与变换后的四个点
src = np.float32([[506,210],[1268,206],[1366,450],[ 258,460]])
dst = np.float32([[258, 210], [1366, 210], [1366, 460], [258, 460]])
dst = np.array(dst,dtype = 'float64')
src = np.array(src,dtype = 'float64')
#求透视变换矩阵
matrix = cv2.getPerspectiveTransform(np.float32(src), np.float32(dst))
#原始点,计算变换后的点位置
#p为原始点,也是一个顶点,转换后也应该为一个顶点
p = (506,210)
#方法1:与矩阵中单点进行计算
px = (matrix[0][0]*p[0] + matrix[0][1]*p[1] + matrix[0][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
py = (matrix[1][0]*p[0] + matrix[1][1]*p[1] + matrix[1][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
print(px,py)
#方法2:与整个矩阵直接计算
s1 = np.array([[506,210,1]])
s11 = s1[:,:2]
print(s11)
print(np.dot(s1,matrix))
s2 = np.dot(s1,matrix)
s22 = s2[:,:2]
for s in s2:
ss1 = s[0]/s[2]
ss2 = s[1]/s[2]
#画出两个多边形
poly1 = Polygon(dst)
poly2 = Polygon(src)
ax = plt.gca() #获取到当前坐标轴信息
ax.xaxis.set_ticks_position('top') #将X坐标轴移到上面
ax.invert_yaxis() #反转Y坐标轴
plt.plot(*poly1.exterior.xy)
plt.plot(*poly2.exterior.xy)
#画出变换前后的点
plt.plot([s11[0][0],ss1],[s11[0][1],ss2],'o')
plt.show()
运行结果
实际位置应该为1处,结果为2处