图片的透视变换

目录

1.透视变换结果溢出原图边界

2.相应的图片标签(box)怎样在透视变换后找到对应的坐标点


网上关于透视变换的文章很多,特别是对于原理解析的文章,所以我只记录下使用过程中遇到的问题;

1.透视变换结果溢出原图边界

本人的处理方法:

step1:根据原始的四个坐标点和目标的四个坐标点得到变换矩阵;

#p1:原图中的四个坐标点,p2:目标图中的四个坐标点
M = cv2.getPerspectiveTransform(p1, p2)

step2:将图片的边界的四个顶点输入到变换矩阵,得到变换后的四个坐标顶点;

h, w = image.shape[:2]
po1 = cv2.perspectiveTransform(np.array([[[0, 0]]], dtype=np.float32), M)
po2 = cv2.perspectiveTransform(np.array([[[w, 0]]], dtype=np.float32), M)
po3 = cv2.perspectiveTransform(np.array([[[w, h]]], dtype=np.float32), M)
po4 = cv2.perspectiveTransform(np.array([[[0, h]]], dtype=np.float32), M)

step3:根据变换后坐标顶点,判断图像顶点是否超出边界,若超出边界,则计算新的图片尺寸,对原始图片进行平移;

list_x = [po1[0][0][0], po2[0][0][0], po3[0][0][0], po4[0][0][0]]
list_y = [po1[0][0][1], po2[0][0][1], po3[0][0][1], po4[0][0][1]]
minx = min(list_x)
miny = min(list_y)
maxx = max(list_x)
maxy = max(list_y)
maxx = int(maxx - minx)
maxy = int(maxy - miny)
            
widthNew = maxx
heightNew = maxy

move_x = 0
move_y = 0

image1 = None
if minx < 0: #x轴方向要进行平移
    move_x = -minx
if miny < 0: #y轴方向要进行平移
    move_y = -miny


if move_y !=0 or move_x !=0:
    # 加入平移操作
    # M = np.float32([[1, 0, 100], [0, 1, 50]])  # (x,y) -> (100,50)
    # dst = cv.warpAffine(img, M, (cols, rows))
    mat_translation = np.float32([[1, 0, move_x], [0, 1, move_y]])  # 变换矩阵:设置平移变换所需的计算矩阵:2行3列
    # [[1,0,20],[0,1,50]]   表示平移变换:其中20表示水平方向上的平移距离,50表示竖直方向上的平移距离。
    image1 = cv2.warpAffine(image, mat_translation, (widthNew, heightNew), borderValue=(122, 122, 122))

step4:对step3的结果进行透视变换;

dst = cv2.warpPerspective(image1, M, [maxx, maxy]) #对图像进行透视变换

2.相应的图片标签(box)怎样在透视变换后找到对应的坐标点

这里只需要注意一点:大角度图片的标签要是左上顶点和右下顶点的矩形,透视变换后的坐标区域并不是很贴合真实需要检测的区域;最好的办法是使用四个顶点(左上,右上,右下,左下)的多边形的标签(这种多边形标签多用在ocr的文字区域检测任务中)的坐标做透视变换;如果只是简单的使用矩形的四个坐标点做透视变换,那么新的标签也不会贴合相应的目标检测区域;

好文章链接:

 (学习笔记)透视变换及其python实现_lytlysll的博客-CSDN博客解决透视变换后图片信息丢失的问题,附程序_xiaoyeer666的博客-CSDN博客python cv2中的透视变换 - 江南烟雨尘 - 博客园Python 计算机视觉(五)特别篇 —— 透视变换_一马归一码的博客-CSDN博客python opencv 图像透视变换,图像平移,图像旋转,图像翻转_luolinll1212的专栏-CSDN博客

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫与橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值