cv2.getPerspectiveTransform求原位置的点经过透视变换后的位置出错

求原位置的点经过透视变换后的位置

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()

运行结果

img

实际位置应该为1处,结果为2处

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。