OpenCV 实现透视变换

这篇具有很好参考价值的文章主要介绍了OpenCV 实现透视变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:OpenCV透视变换的概念

仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之地。两种变换原理相似,结果也类似,可针对不同的场合使用适当的变换。

仿射变换和透视变换的数学原理不需深究,在应用层面,仿射变换是图像基于3个固定顶点的变换,如下图所示:

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

 仿射变换是图像基于3个固定顶点的变换,接下来学习的透视变换是4个固定顶点的变换

二:透视变换工作原理

透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为:

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

(u,v)为原始图像像素坐标,(x=x’/w’,y=y’/w’)为变换之后的图像像素坐标。透视变换矩阵图解如下: 

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

仿射变换(Affine Transformation)可以理解为透视变换的特殊形式。透视变换的数学表达式为:

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

所以,给定透视变换对应的四对像素点坐标,即可求得透视变换矩阵;反之,给定透视变换矩阵,即可对图像或像素点坐标完成透视变换,如下图所示:

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

三 ,透视变换的基本步骤

  1. 确定变换前后的四个对应点:选择变换前图像中的四个关键点,分别对应变换后图像中的四个点。这四个点应该能够构成一个矩形或者四边形,以便进行透视变换。

  2. 计算透视变换矩阵:通过选定的对应点,利用线性代数的方法计算出透视变换矩阵。这个矩阵可以将原始图像中的点映射到目标图像中对应的位置。

  3. 应用透视变换矩阵:利用计算得到的透视变换矩阵,对原始图像进行变换操作。通过在原始图像上的每个像素点应用透视变换矩阵,计算出对应的目标图像中的位置。

  4. 可选的后处理:根据需要,可以对变换后的图像进行一些额外的后处理操作,比如插值、边缘平滑等,以获得更好的视觉效果。

汽车的360度全景影像,从拍照视角变成鸟瞰图

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

常见的有文档矫正和汽车摄像头转成鸟瞰图,因为视角的原因,近处宽远处窄,呈不规则的四边形

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

仿射变换是单纯对图片进行平移,缩放,错切(倾斜)和旋转,而这几个操作都不会改变图片线之间的平行关系
仿射变换是在二维空间中,而透视变换则是在三维空间中视角的变化

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

T1为线性变换完成旋转,错切和放缩,T2完成平移操作,T3就是设了两个变量来表示映射关系

需要选取原图上的四个点以上的点集,并计算出该点集变换后的位置

from cv2 import cv2
import numpy as np

# 定义鼠标点击事件的回调函数
def get_mouse_position(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f"Clicked at position ({x}, {y})")

# 读取图片文件
demo_file_path = 'paper.jpg'
img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)


#获取高宽,调整大小
h ,w = img.shape[:2]
print(h,w)  #4624 3472
img2 = cv2.resize(img,(434,578))  #这里新的大小,h,w和上面展示的h,w顺序相反
cv2.imshow('img2',img2)

#创建窗口并绑定鼠标事件回调函数
cv2.namedWindow('img2')
cv2.setMouseCallback('img2',get_mouse_position)


# 定义对应的点 原始1(书本的4个角落坐标)、变换2
pts1 = np.float32([[109, 148], [307, 135], [99, 456], [326, 452]])
pts2 = np.float32([[0, 0], [434, 0], [0, 578], [434, 578]])

# 计算得到转换矩阵 3*3
M = cv2.getPerspectiveTransform(pts1, pts2)

# 透视变换
new_img = cv2.warpPerspective(img2, M, (280, 350))

cv2.imshow('perspective img', new_img)
cv2.waitKey(0)

opencv透视变化c实现,机器视觉从入门到精通,OpenCV从入门到精通,单目,opencv,人工智能,计算机视觉,目标跟踪

四,注意事项

需要注意的是,在进行透视变换时,选择合适的对应点非常重要。对应点的选择应该能够准确地反映出透视畸变,并且能够保持图像内容的一致性。此外,透视变换一般需要借助计算机图形学或图像处理库来实现,例如OpenCV等。

透视变换在许多应用中都有广泛的应用,比如摄影中的图像校正、增强现实中的虚拟物体渲染、计算机视觉中的物体检测与跟踪等。通过透视变换,可以改善图像的观感,提高图像处理和分析的准确性。文章来源地址https://www.toymoban.com/news/detail-764245.html

到了这里,关于OpenCV 实现透视变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【opencv】:图像的透视变换

    仿射变换(Affine Transformation或 Affine Map) , 又称为仿射映射, 是指在几何中, 图像进行从一个向量空间进行一次线性变换和一次平移, 变换为到另一个向量空间的过程。我们常说的仿射变换是透视变换的一个特例。 以上便是透视变换的原理图,即将源图像通过投影映射,

    2024年02月15日
    浏览(44)
  • OpenCV利用透视变换矫正图像

    案例:使用OpenCV将一张折射的图片给矫正过来 实现步骤: 1.载入图像 2.图像灰度化 3.二值分割 4.形态学操作去除噪点 5.轮廓发现 6.使用霍夫直线检测,检测上下左右四条直线(有可能是多条,但是无所谓) 7.绘制出直线 8.寻找与定位上下左右是条直线 9.拟合四条直线方程 1

    2024年02月06日
    浏览(66)
  • 使用opencv对图像进行透视变换

    一.什么是透视变换 透视变换就是透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简单的来说就是

    2024年02月08日
    浏览(51)
  • C++ Opencv之3D透视变换

    各位小伙伴们是不是经常出现拍摄角度不佳,看着特别难受,想把图片中的某个物体翻转一下呢? 本文就以下面这本书为例,只需要鼠标按照顺时针点击书的四个脚就可以完成变换: 侧着看好难受哦,想看正面怎么办? 效果: 舒服了!!! 目录 流程讲解: 1.先读取一个需要3D透视变换的图

    2024年02月03日
    浏览(39)
  • Python中OpenCV透视变换恢复扭曲图像

    在处理图像问题时,经常会遇到将要处理的目标的位置是斜的,需要使用透视变换进行矫正。如下图,该图片中左边的目标是扭曲倾斜拍摄的,那么任务就是将其矫正过来,如下图右图所示。 前提1:这里假设我已经知道四个点坐标(可用深度学习方法检测/分割)和目标宽高

    2024年01月20日
    浏览(50)
  • 【Python】【OpenCV】OCR识别(二)——透视变换

    对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的。 针对上述情况,所以我们在处理有角度的图象时,需要将图像“摆正”,将使用到getPerspectiveTransform方法和

    2024年02月03日
    浏览(44)
  • 我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

    几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine :使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。 cv2.warpPerspective :使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等操作。 cv2.getAffineTransform :计算仿射变换

    2024年02月05日
    浏览(66)
  • 【Python图像处理篇】opencv中的仿射变换和透视变换

    仿射变换可以将矩形图片映射为平行四边形, 透视变换可以将矩形图片映射为任意四边形。 opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective, 使用这两个函数可以实现所有类型的变换。 cv2.warpAffine 接收的参数2x3的变换矩阵; 而 cv2.warpPerspective 接收的3x3的变换矩阵。

    2024年01月24日
    浏览(67)
  • (九)相机内参、外参、反透视变换python opencv

    任务需求:将相机上的一个点投影到真实世界平面上去。 原则上单目相机是不可以的,因为只记录了二维信息,真实世界是三维的,双目相机可以通过视差,或者单目+IMU组合,但是 由于特征点在地面上的先验知识 ,因此可以进行反透视变换。方法有很多种那个,这里采用计

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包