小苑江湖 2022-04-14 14:41 采纳率: 0%
浏览 79
已结题

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处

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2022-04-18 10:07
    关注

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


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

    评论

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 修改了问题 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真