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),则还可以对图像进行重新映射以适应不同的视角或裁剪区域。

函数原型

cpp 复制代码
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 相同,但你可以通过使用不同的矩阵来额外缩放和平移结果。

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

void addRadialDistortion( const Mat& src, Mat& dst, double k1 = 0.001 )
{
    Mat map_x( src.size(), CV_32FC1 );
    Mat map_y( src.size(), CV_32FC1 );

    // 获取中心点
    Point2f center( src.cols / 2.0, src.rows / 2.0 );

    for ( int y = 0; y < src.rows; ++y )
    {
        for ( int x = 0; x < src.cols; ++x )
        {
            // 计算从中心点的距离
            float dx = x - center.x;
            float dy = y - center.y;
            float r2 = dx * dx + dy * dy;

            // 应用径向畸变公式
            float factor              = 1 + k1 * r2;
            map_x.at< float >( y, x ) = factor * dx + center.x;
            map_y.at< float >( y, x ) = factor * dy + center.y;
        }
    }

    // 应用映射
    remap( src, dst, map_x, map_y, INTER_LINEAR );
}

int main()
{
    // 读取原始图像(确保路径正确)
    Mat src = imread( "/media/dingxin/data/projects/ir/bin/shape.png" );
    if ( src.empty() )
    {
        cerr << "Error: Could not open or find the image!" << endl;
        return -1;
    }

    // 创建带有人工畸变的图像
    Mat distorted;
    addRadialDistortion( src, distorted, 0.002 );  // 调整k1值来控制畸变强度

    // 显示结果
    imshow( "Original Image", src );
    imshow( "Artificially Distorted Image", distorted );

    waitKey( 0 );  // 等待按键关闭窗口

    // 保存畸变图像以便后续使用
    imwrite( "distorted_image.png", distorted );

    return 0;
}

运行结果

`

相关推荐
ComputerInBook19 小时前
opencv 图像处理之边缘检测
图像处理·人工智能·opencv·边缘检测
苏州邦恩精密20 小时前
浙江蔡司3D扫描仪如何服务汽车及模具行业?
人工智能·科技·3d·自动化·汽车·制造
3D小将20 小时前
3D格式转换之NWD 转 GLB 格式标准化转换技术
3d·solidworks模型·ug模型·rhino模型·catia模型
玖玥拾20 小时前
Unity 3D 基础(一)Unity基础架构、物理系统、视觉渲染、空间变换与对象查询
笔记·游戏·3d·unity·游戏引擎
在水一缸21 小时前
Box3D 深度解析:当物理引擎传奇迈向三维空间
3d·游戏开发·开源项目·物理引擎·box3d·3d仿真·box2d
苏州邦恩精密1 天前
浙江蔡司3D扫描仪应用领域及厂家选择分析
人工智能·科技·3d·自动化·制造
TMT星球1 天前
高德发布通用世界模型工坊ABot-World Studio: 5090单卡可生成小时级实时交互式视频与3D场景
3d
某林2121 天前
构建高精度 6-DoF 灵巧手控制系统
人工智能·3d·机器人·ros2·技术复盘
3DVisionary1 天前
注塑模具3D检测的下一个十年:从“事后把关“到“全程数字孪生“
前端·数据库·3d·注塑模具检测趋势·在线全检自动化·ai缺陷识别·模具数字孪生
cd_949217211 天前
3D角色自动绑骨怎么做?用V2Fun完成建模、绑定、动作和导出
人工智能·3d