OpenCV之cv::undistort

server/2024/9/25 21:29:23/

在 OpenCV 中,cv::undistort 函数用于校正畸变的图像。它的基本形式如下:

void undistort(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArray newCameraMatrix = noArray());

参数解释:

  1. src:输入图像。这是需要进行畸变校正的原始图像。

  2. dst:输出图像。这是校正后的图像,应当预先分配空间。

  3. cameraMatrix:摄像机内参数矩阵(3x3)。这是摄像机的内部参数矩阵,包括焦距、主点的位置等信息。可以通过 cv::calibrateCamera 函数从一组标定图像中获取。

  4. distCoeffs:畸变系数。这是一个包含畸变系数的向量,通常有5个或更多参数,用于描述径向和切向畸变。

  5. newCameraMatrix:新的摄像机内参数矩阵(可选)。如果指定了这个参数,函数将使用它来重映射输出图像。默认情况下,使用输入的 cameraMatrix 进行校正。

参数详解:

  • 摄像机内参数矩阵 (cameraMatrix):这是一个 3x3 的矩阵,通常包含以下参数:

    • fx:焦距在 x 方向上的缩放因子。
    • fy:焦距在 y 方向上的缩放因子。
    • cx:主点在 x 方向上的偏移量。
    • cy:主点在 y 方向上的偏移量。
    • 1:固定为1。

    例如,一个典型的摄像机内参数矩阵可能是:

    [ fx  0  cx ]
    [ 0   fy cy ]
    [ 0   0   1 ]
    
     
  • 畸变系数 (distCoeffs):这个向量通常包含以下参数:

    • k1, k2, p1, p2, k3:径向畸变和切向畸变的系数。

distCoeffs 是用于描述摄像机畸变的系数向量。畸变是由于摄像机透镜的物理特性引起的,会导致图像中的直线弯曲或图像的形状发生变化。为了对图像进行校正,需要使用畸变系数来消除或减小这种畸变。

distCoeffs 通常包含以下参数:

  1. 径向畸变系数(Radial Distortion Coefficients):径向畸变是由于透镜形状与理想平面透镜之间的差异而导致的。它使得离光轴越远的像素比离光轴近的像素更远,从而产生了图像中的弯曲现象。径向畸变系数通常有两个或三个参数:

    • k1:主要径向畸变系数,控制着一阶径向畸变的影响。
    • k2:次要径向畸变系数,控制着二阶径向畸变的影响。
    • k3:三阶径向畸变系数,控制着更高阶径向畸变的影响。
  2. 切向畸变系数(Tangential Distortion Coefficients):切向畸变是由于透镜与图像平面之间不是完全平行而引起的。它会引起图像中的像素在水平和垂直方向上的扭曲。切向畸变系数通常有两个参数:

    • p1:第一个切向畸变系数,控制着水平方向上的切向畸变。
    • p2:第二个切向畸变系数,控制着垂直方向上的切向畸变。

这些畸变系数的值可以通过使用摄像机标定技术从一组畸变图像中获得。在标定过程中,通过对已知形状的标定板进行观察,计算出这些系数的值。然后,这些系数可以用于校正从相同摄像机拍摄的其他图像。

通过将畸变系数传递给 cv::undistort 函数,可以对图像进行畸变校正,以获得更准确、形状更正常的图像。

在讨论摄像机的径向畸变时,“一阶”、“二阶”和“三阶”是指畸变模型中不同阶次的多项式项。这些项用于描述图像中径向失真的复杂程度。具体来说:

  1. 一阶径向畸变 (First-order Radial Distortion)

    • 由系数 k1 控制,主要描述最基本的径向畸变。畸变量与半径的平方成正比。
    • 数学表达式中的一阶项:k1 * r^2,其中 r 是从图像中心(也称为主点)到当前像素的距离。
  2. 二阶径向畸变 (Second-order Radial Distortion)

    • 由系数 k2 控制,描述更复杂的径向畸变。畸变量与半径的四次方成正比。
    • 数学表达式中的二阶项:k2 * r^4
  3. 三阶径向畸变 (Third-order Radial Distortion)

    • 由系数 k3 控制,进一步描述了极端情况下的畸变。畸变量与半径的六次方成正比。
    • 数学表达式中的三阶项:k3 * r^6

这些项可以组合在一起,以提供对不同复杂程度的径向畸变的更精确描述。具体的畸变校正公式可以表示为:

[ x_{\text{corrected}} = x \cdot (1 + k1 \cdot r^2 + k2 \cdot r^4 + k3 \cdot r^6) ] [ y_{\text{corrected}} = y \cdot (1 + k1 \cdot r^2 + k2 \cdot r^4 + k3 \cdot r^6) ]

这里 ( (x, y) ) 是未校正的像素坐标,( (x_{\text{corrected}}, y_{\text{corrected}}) ) 是校正后的像素坐标,( r ) 是像素到图像中心的距离。

切向畸变 (Tangential Distortion)

切向畸变由两个系数 p1p2 控制,描述由于摄像机镜头与图像平面不完全平行导致的畸变。切向畸变校正公式如下:

[ x_{\text{corrected}} = x + [2 \cdot p1 \cdot x \cdot y + p2 \cdot (r^2 + 2 \cdot x^2)] ] [ y_{\text{corrected}} = y + [p1 \cdot (r^2 + 2 \cdot y^2) + 2 \cdot p2 \cdot x \cdot y] ]

综合畸变模型

综合考虑径向和切向畸变的校正公式如下:

[ x_{\text{corrected}} = x \cdot (1 + k1 \cdot r^2 + k2 \cdot r^4 + k3 \cdot r^6) + [2 \cdot p1 \cdot x \cdot y + p2 \cdot (r^2 + 2 \cdot x^2)] ] [ y_{\text{corrected}} = y \cdot (1 + k1 \cdot r^2 + k2 \cdot r^4 + k3 \cdot r^6) + [p1 \cdot (r^2 + 2 \cdot y^2) + 2 \cdot p2 \cdot x \cdot y] ]

通过上述公式,可以将包含畸变的像素坐标转换为校正后的像素坐标,从而消除摄像机拍摄图像中的畸变。

使用示例:

cv::Mat src = cv::imread("input_image.jpg", cv::IMREAD_COLOR);
cv::Mat dst;cv::Mat cameraMatrix; // 从标定结果中获取
cv::Mat distCoeffs;   // 从标定结果中获取cv::undistort(src, dst, cameraMatrix, distCoeffs);cv::imshow("Original Image", src);
cv::imshow("Undistorted Image", dst);
cv::waitKey(0);
 

在这个示例中,我们加载了一张图像 input_image.jpg,然后使用 cv::undistort 函数对它进行畸变校正,并显示校正前后的图像。

畸变校正是摄影测量中非常重要的步骤,可以提高图像处理和测量的精度。


http://www.ppmy.cn/server/49326.html

相关文章

web前端黑马下载:探索学习资源的海洋

web前端黑马下载:探索学习资源的海洋 在数字化时代,Web前端技术日益成为互联网行业的核心驱动力。为了跟上这一趋势,众多学习者纷纷投身于Web前端的学习之中。而在这个过程中,“黑马”作为一个备受瞩目的品牌,其Web前…

对大数据的批量导入MySQL数据库

自己的库里有索引在用insert导入数据时会变慢很多 使用事务批量导入 可以配置使用springmybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到mybatis中 http://x125858805.iteye.com/blog/2369243 list.a…

Apache网页优化

一、网页压缩与缓存 1.1网页压缩 网站访问速度影响因素:应用程序响应速度、网络带宽、服务器性能、与客户端之间网络传输速度等。其中最重要的是一个因素是Apache本身,因此提升Apache执行速度(使用网页压缩)是性价比最高的选择。…

C | 在ubuntu22下开发的一些配置

目录 VScode设置 要下载的插件: 卸载VScode的话就是哪装的哪删。 浅用gcc 预处理指令 使用gcc 语言编译过程 1. 预处理(Preprocessing) 2. 编译(Compilation) 3. 汇编(Assembly) 4. …

Element-UI - 解决el-table中图片悬浮被遮挡问题

在开发中,发现element-ui在el-table中添加图片悬浮显示时,会被单元格遮挡的问题。通过查询得到的解决办法,大多是修改.el-table类中相关样式属性,但经过验证发现会影响到其他正常功能的使用。对于此问题解决其实也并不难&#xff…

存储器的性能指标以及层次化存储器

存储器的性能指标 存储器有三个性能指标:速度、容量和位价(每位价格) 1.存储速度 (1)存取时间 想衡量存储速度,最直观的指标就是完成一次存储器读写操作所需要的时间,这叫做存取时间&#x…

从局部到全局:产品开发视角的转变与系统优化策略

一、研发背景 在科技产品开发领域,每一种产品都存在着多元化的开发方案可供选择,这要求开发者不断拓展视野,进行横向对比学习,以期找到最贴合市场需求、最具竞争优势的解决方案。以往,我们的研发团队一直立足于稳固而…

.net8 blazor auto模式很爽(五)读取sqlite并显示(2)

在BlazorApp1增加文件夹data&#xff0c;里面增加类dbcont using SharedLibrary.Models; using System.Collections.Generic; using Microsoft.EntityFrameworkCore;namespace BlazorApp1.data {public class dbcont : DbContext{public dbcont(DbContextOptions<dbcont>…