计算机视觉 图像形成 镜头畸变

计算机视觉 图像形成 镜头畸变成像模型都假设相机遵循线性投影模型 其中世界中的直线即图像中的直线 这是将线性矩阵运算应用于齐次坐标的自然结果 不幸的是 许多广角镜头具有明显的径向畸变 这表现为直线投影中的可见曲率 有关镜头光学和色差 除非考虑到这种失真 否则不可能创建高度准确的照片级逼真重建 例如 在未考虑径向失真的情况下构建的图像马赛克通常会由于像素混合之前相应特征的配准错误而表现出模糊 幸运的是 在实践中补偿径向失真并不是那么困难 对于大多数镜头 一个简单的四次失真模型可以产生良好的效果 令为透视分割后但

        成像模型都假设相机遵循线性投影模型,其中世界中的直线即图像中的直线。(这是将线性矩阵运算应用于齐次坐标的自然结果。)不幸的是,许多广角镜头具有明显的径向畸变,这表现为直线投影中的可见曲率。(有关镜头光学和色差)除非考虑到这种失真,否则不可能创建高度准确的照片级逼真重建。例如,在未考虑径向失真的情况下构建的图像马赛克通常会由于像素混合之前相应特征的配准错误而表现出模糊。

         幸运的是,在实践中补偿径向失真并不是那么困难。 对于大多数镜头,一个简单的四次失真模型可以产生良好的效果。 令(x_c, y_c)为透视分割后但在焦距f缩放和图像中心(c_x, c_y)移动之前获得的像素坐标,即

计算机视觉 图像形成 镜头畸变

         径向畸变模型表明,观察到的图像中的坐标偏离图像中心(桶形畸变)或远离(枕形畸变),位移量与它们的径向距离成正比(图 2a-b)。最简单的径向畸变模型使用低阶多项式,例如,

计算机视觉 图像形成 镜头畸变

其中 r^2_c = x^2_c+ y^2_ck_1k_2 称为径向畸变参数。该模型还包括一个用于解释镜头偏心的切向分量,由 Brown (1966) 在摄影测量文献中首次提出,因此是 有时称为布朗或布朗-康拉迪模型。 然而,失真的切向分量通常被忽略,因为它们会导致估计不太稳定。

         在径向失真步骤之后,可以使用计算最终像素坐标

计算机视觉 图像形成 镜头畸变

         可以使用多种技术来估计给定镜头的径向畸变参数。

        有时,上述简化模型无法足够准确地模拟复杂镜头产生的真实失真(尤其是在非常广角时)。 更完整的分析模型还包括切向畸变和偏心畸变(Slama 1980)。

         鱼眼镜头(图 2c)需要一个不同于传统径向畸变多项式模型的模型。 鱼眼镜头的行为,第一个近似值,作为远离光轴角度的等距离投影仪,

计算机视觉 图像形成 镜头畸变
图 2 径向镜头畸变:(a) 桶形,(b) 枕形,和 (c) 鱼眼。 鱼眼图像从一侧到另一侧几乎跨越 180°。

计算机视觉 图像形成 镜头畸变

        由于距中心的距离(像素)和视角之间大多是线性映射,因此此类镜头有时被称为 f-theta 镜头,这很可能是流行的 RICOH THETA 360° 相机得名的地方。 Xiong 和 Turkowski (1997) 描述了如何通过添加额外的二次校正来扩展该模型,以及如何从一组重叠的鱼眼图像中估计未知参数(投影中心、缩放因子 s 等) 使用直接(基于强度)非线性最小化算法。

        对于更大、更不规则的失真,可能需要使用样条的参数失真模型(Goshtasby 1989)。 如果镜头没有单个投影中心,则可能需要分别对与每个像素对应的 3D 线(与方向相反)建模(Gremban、Thorpe 和 Kanade 1988;Champleboux、Lavall´ee 等人 1992a ;Grossberg 和 Nayar 2001;Sturm 和 Ramalingam 2004;Tardif、Sturm 等人 2009)。 我们将在后面讨论如何校准镜头畸变。

计算机视觉 图像形成 镜头畸变
失真会使图像中的直线不再平行,尤其是在帧的边缘。

         与简单的径向失真模型相关的一个微妙问题经常被忽略。 我们在透视投影和最终传感器阵列投影步骤之间引入了非线性。 因此,一般来说,我们不能对任意3 \times 3矩阵 K 进行旋转后乘以将其转化为上三角形式并将其吸收到全局旋转中。 然而,这种情况并不像最初看起来那么糟糕。 如果我们将径向和其他失真校正到保留直线的精度,我们基本上已经将传感器转换回线性成像器,并且之前的分解仍然适用。

        使用 OpenCV 消除失真

        消除因镜头引起的失真的三个主要步骤

        1、执行相机标定并获取相机的内在参数。内在参数还包括相机畸变参数。

        估计相机参数(相机校准)相关参考

OpenCV每日函数 相机校准calibrateCamera函数估计相机参数的过程称为相机校准。这意味着我们拥有相机所需的所有信息(参数或系数),以确定现实世界中的3D 点与其在该校准相机捕获的图像中对应的 2D 投影(像素)之间的准确关系。通常这意味着恢复两种参数内部参数:例如相机/镜头系统的镜头的焦距、光学中心和径向畸变系数。外部参数:这是指相机相对于某个世界坐标系的方向(旋转和平移)。计算机视觉 图像形成 镜头畸变https://skydance.blog.csdn.net/article/details/126795033

        2、使用getOptimalNewCameraMatrix()方法得到优化相机矩阵以控制未失真图像中不需要的像素的百分比。

        参考下图,在右图中,我们看到边缘附近有一些黑色像素。这些是由于图像的不失真而发生的。有时这些黑色像素在最终的未失真图像中是不需要的。因此getOptimalNewCameraMatrix () 方法返回一个精确的相机矩阵和 ROI(感兴趣区域),可用于裁剪图像以排除所有黑色像素。要消除的不需要像素的百分比由参数 alpha 控制,该参数作为参数传递给getOptimalNewCameraMatrix () 方法。

计算机视觉 图像形成 镜头畸变

        3、使用优化的相机矩阵减少图像失真。

        pyhon参考代码

# Refining the camera matrix using parameters obtained by calibration newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h)) # Method 1 to undistort the image dst = cv2.undistort(img, mtx, dist, None, newcameramtx) # Method 2 to undistort the image mapx,mapy=cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5) dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR) # Displaying the undistorted image cv2.imshow("undistorted image",dst) cv2.waitKey(0)

        c++参考代码

cv::Mat dst, map1, map2,new_camera_matrix; cv::Size imageSize(cv::Size(image.cols,image.rows)); // Refining the camera matrix using parameters obtained by calibration new_camera_matrix = cv::getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0); // Method 1 to undistort the image cv::undistort( frame, dst, new_camera_matrix, distCoeffs, new_camera_matrix ); // Method 2 to undistort the image cv::initUndistortRectifyMap(cameraMatrix, distCoeffs, cv::Mat(),cv::getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),imageSize, CV_16SC2, map1, map2); cv::remap(frame, dst, map1, map2, cv::INTER_LINEAR); //Displaying the undistorted image cv::imshow("undistorted image",dst); cv::waitKey(0);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221363.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:17
下一篇 2026年3月17日 下午6:18


相关推荐

  • 2021Eclipse最新下载与安装教程

    2021Eclipse最新下载与安装教程2021Eclipse下载与安装教程具体步骤如下:1.下载Eclipse软件下载可以在Eclipse官方下载,也可以在国内镜像地址下载。由于Eclipse官方地址服务器在国外,下载速度比较慢,国内镜像地址下载速度会快很多。1.1官方下载官方下载地址:https://www.eclipse.org/downloads/packages/release.访问官方下载地址。如下所示:在这里插入图片描述点击要下载的版本,以2018-09为例,进入下面窗口,选择Rpackages在这里插入图

    2022年6月3日
    39
  • vue中computed计算属性传入参数

    vue中computed计算属性传入参数使用 JavaScript 闭包 进行传值操作 computed 控制显示的内容 computedTxt returnfuncti value returnthis methodGetByt value 20 做一个简单的功能 使用计算属性判断传入的

    2026年3月18日
    2
  • 讯飞Air2Pro使用指南 快速上手教程秘籍

    讯飞Air2Pro使用指南 快速上手教程秘籍

    2026年3月14日
    3
  • mysql中phpmyadmin安装教程_特详细的PHPMYADMIN简明安装教程

    mysql中phpmyadmin安装教程_特详细的PHPMYADMIN简明安装教程特详细的PHPMYADMIN简明安装教程更新时间:2008年08月01日00:27:12作者:简单的说,phpmyadmin就是一种mysql的管理工具,安装该工具后,即可以通过web形式直接管理mysql数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管理者,下面我就说下怎么安装该工具:1.先到网上下载phpmyadmin,再解压到可以访问的web目录下(如果…

    2022年5月31日
    32
  • 深入浅出理解 Java回调机制(异步)

    深入浅出理解 Java回调机制(异步)本片文章为转载,原文地址:http://codecloud.net/java-5-6371.html什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百度百科中是这样的:

    2022年7月21日
    16
  • mac idea永久激活码【永久激活】

    (mac idea永久激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~M…

    2022年3月21日
    299

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号