当前位置: 首页 > article >正文

OpenCV相机标定与3D重建(63)校正图像的畸变函数undistort()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

转换图像以补偿镜头畸变。

该函数通过变换图像来补偿径向和切向镜头畸变。

此函数仅仅是 initUndistortRectifyMap(使用单位矩阵 R)和 remap(使用双线性插值)的组合。有关执行的具体变换详情,请参阅前者函数。

对于在源图像中没有对应像素的目的图像中的像素,将用零(黑色)填充。

可以通过 newCameraMatrix 来调节源图像中哪些特定子集将在校正后的图像中可见。你可以使用 getOptimalNewCameraMatrix 来根据你的需求计算适当的 newCameraMatrix。

相机矩阵和畸变参数可以使用 calibrateCamera 确定。如果图像的分辨率与标定阶段使用的分辨率不同,则需要相应地缩放 fx, fy, cx 和 cy,而畸变系数保持不变。

cv::undistort 是 OpenCV 库中的一个函数,用于校正图像的畸变。它根据提供的相机内参矩阵 (cameraMatrix) 和畸变系数 (distCoeffs) 来移除图像中的径向和切向畸变。如果提供了新的相机矩阵 (newCameraMatrix),则还可以对图像进行重新映射以适应不同的视角或裁剪区域。

函数原型

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

参数

src:输入(畸变)图像。
dst:输出(校正)图像,该图像具有与 src 相同的尺寸和类型。
cameraMatrix:输入相机矩阵 A = [ f x 0 c x 0 f y c y 0 0 1 ] A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} A= fx000fy0cxcy1
distCoeffs:输入的畸变系数向量,包含 4、5、8、12 或 14 个元素,具体为 (k1, k2, p1, p2 [,k3 [,k4, k5, k6 [,s1, s2, s3, s4 [,τx, τy]]]])。如果该向量为 NULL 或空,则假定畸变系数为零。
newCameraMatrix:畸变图像的相机矩阵。默认情况下,它与 cameraMatrix 相同,但你可以通过使用不同的矩阵来额外缩放和平移结果。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 读取输入图像
    Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/distorted_image.jpg" );
    if ( src.empty() )
    {
        cout << "Could not open or find the image!" << endl;
        return -1;
    }

    // 假设我们已经得到了相机的内参矩阵 cameraMatrix 和畸变系数 distCoeffs
    // 这些值通常是通过相机标定获得的。
    // 下面的例子中,我们将使用一些假设的值。
    Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 520.9, 0, 328.1, 0, 521.0, 247.6, 0, 0, 1 );
    Mat distCoeffs   = ( Mat_< double >( 5, 1 ) << 0.2624, -0.9531, -0.0054, 0.0026, 1.1633 );

    // 定义输出图像
    Mat dst;

    // 畸变校正
    undistort( src, dst, cameraMatrix, distCoeffs );

    // 或者使用新的相机矩阵进行畸变校正,以优化结果
    // 首先计算最佳的新相机矩阵
    Mat newCameraMatrix;
    Rect validPixROI;
    newCameraMatrix = getOptimalNewCameraMatrix( cameraMatrix, distCoeffs, src.size(), 1, src.size(), &validPixROI );

    // 使用新相机矩阵进行畸变校正
    undistort( src, dst, cameraMatrix, distCoeffs, newCameraMatrix );

    // 显示原图和校正后的图像
    imshow( "Distorted Image", src );
    imshow( "Undistorted Image", dst );
    waitKey( 0 );  // 等待按键关闭窗口

    // 保存校正后的图像
    imwrite( "undistorted_image.png", dst );

    return 0;
}

http://www.kler.cn/a/512429.html

相关文章:

  • 记录一下OpenCV Contrib 编译踩的坑
  • PHP语言的语法糖
  • 在 Babylon.js 中使用 Gizmo:交互式 3D 操作工具
  • K8S中Pod控制器之Job控制器
  • OSI七层协议——分层网络协议
  • 强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!
  • Linux高级--3.3.1 C++ spdlog 开源异步日志方案
  • Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放
  • 实现二叉树_堆
  • 【Mac】ComfyUI 部署
  • 算法题目总结-链表
  • 【Maui】视图界面与数据模型绑定
  • django应急物资管理系统
  • 基于FPGA的BPSK+costas环实现,包含testbench,分析不同信噪比对costas环性能影响
  • 英文隐私政策翻译
  • 【vitePress】基于github快速添加评论功能(giscus)
  • Kubernetes:基础的架构
  • 《Opencv》图像的透视变换--处理发票
  • 【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间
  • C语言文件
  • 事件驱动量化回测 UML 序列图
  • 深入Spring Boot:自定义Starter开发与实践
  • uniapp button按钮去掉默认样式
  • C# 给定欧氏平面中的一组线可以形成的三角形的数量
  • 【新人系列】Python 入门(二十八):常用标准库 - 上
  • 算法题目总结-二叉树