opencv实践-图像去畸变

news/2024/11/8 16:42:06/

目录

  • 1.背景
  • 2.镜头成像畸变原因
  • 3.去畸变方法
  • 4. opencv去畸变函数
  • 5.代码实现

1.背景

由于相机的镜头并不完全理想,成像时会产生线条扭曲、失真等。对双目图像、鸟瞰图等进行处理时,首先要矫正去畸变。

2.镜头成像畸变原因

相机的镜头前有一块透镜,由于透镜的形状,当光线穿过透镜时,靠近光轴的光线折射比远离光轴的折射要小,就会产生径向畸变,此时真实世界中的直线在图像中会被弯曲,往外弯曲是枕形畸变,如下图(b),往里弯曲是桶形畸变,如下图(c)
在这里插入图片描述
由于透镜不可能完全与相机里的成像面平行,就会造成切向畸变

3.去畸变方法

假设归一化平面上的点P(x, y),可用极坐标(r, θ)表示,r就是P与归一化平面原点之间的距离,径向畸变就可以视为坐标点沿着距离方向发生改变,可以用畸变参数k1,k2,k3来修正;切向畸变可以看作坐标点的水平夹角发生改变。用多项式进行畸变拟合:
在这里插入图片描述
将这些畸变后的点在像素平面上的坐标计算出来:
在这里插入图片描述
然后把畸变后的像素放回原本的位置,即去除了畸变。

4. opencv去畸变函数

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

src 输入图像
dst 输出图像
cameraMatrix 相机内参
distCoeffs 畸变系数矩阵 顺序是[k1, k2, p1, p2]

5.代码实现

int main()
{cv::Mat img = cv::imread("C:\\Users\\Administrator\\Desktop\\20210706221702710.png");cv::Mat k = cv::Mat::eye(3, 3, CV_32FC1);   // 内参矩阵k.at<float>(0, 0) = 458.654;k.at<float>(0, 1) = 0;k.at<float>(0, 2) = 367.215;k.at<float>(1, 0) = 0;k.at<float>(1, 1) = 457.296;k.at<float>(1, 2) = 248.375;k.at<float>(2, 2) = 1;cv::Mat d = cv::Mat::zeros(1, 4, CV_32FC1); // 畸变系数矩阵 顺序是[k1, k2, p1, p2]d.at<float>(0, 0) = -0.28340811;d.at<float>(0, 1) = 0.07395907;d.at<float>(0, 2) = 0.00019359;d.at<float>(0, 3) = 1.76187114e-05;cv::Mat img_distort, img_absdiff;cv::undistort(img, img_distort, k, d);cv::absdiff(img, img_distort, img_absdiff);cv::imshow("img", img);cv::imshow("img_distort", img_distort);cv::imshow("img_absdiff", img_absdiff);cv::waitKey(0);return 0;
}

原图:
一张工厂灰度图,由于畸变导致部分直线条明显被弯曲了
在这里插入图片描述
矫正后的图:
矫正后的图像如下,可见弯曲的线都恢复正常了,但原图部分像素没有还原(落在了矫正后图像的外面)
在这里插入图片描述

参考:https://blog.csdn.net/qq_41035283/article/details/118531027


http://www.ppmy.cn/news/87527.html

相关文章

Flutter_环境配置

FlutterSDK 下载FlutterSDK管理工具<SideKick>下载安装<SideKick>下载FlutterSDK设置全局SDK 修改Flutter配置文件获取全局SDK路径 验证配置是否成功验证环境配置 下载FlutterSDK管理工具 下载安装 SideKick下载链接 下载FlutterSDK 打开 SideKick选择需要的SD…

探秘 | 如何分辨内网和外网?

目录 &#x1f4a1; 什么是外网IP、内网IP&#xff1f; &#x1f4a1; 对于自有路由器上网的用户&#xff0c;可以这样理解外网IP、内网IP &#x1f4a1; 几个大家经常会问的问题 什么是外网IP、内网IP&#xff1f;很多用户都有一个疑惑&#xff0c;如果不使用路由器拨号上网…

五大网络IO模型

网络IO模型 1. IO是什么&#xff1f; I/O&#xff08;英语&#xff1a;Input/Output&#xff09;&#xff0c;即输入&#xff0f;输出&#xff0c;通常指数据在存储器&#xff08;内部和外部&#xff09;或其他周边设备之间的输入和输出&#xff0c;是信息处理系统&#xff0…

android 12.0控制Camera开启功能实现

1.概述 在12.0的产品开发中,需要增加系统属性, 通过系统属性值来控制camera开关来实现是否可用camera的目的,这就需要通过相关管理类来控制相机是否可用打开来实现 2.控制Camera开启功能实现的核心代码 frameworks/base/core/java/android/hardware/camera2/CameraManager…

mysql时间字段属性:datetime、date、timestamp 作用及区别

MySQL字段属性&#xff1a; datetime: 用于存储日期和时间&#xff0c;格式为YYYY-MM-DD HH:MM:SS&#xff0c;范围从’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。 date: 用于存储日期&#xff0c;格式为YYYY-MM-DD&#xff0c;范围从’1000-01-01’到’9999-12-31’…

​Win10更新清理怎么做?

“我有一台华硕二合一笔记本电脑&#xff0c;发现它开始运行缓慢。有时&#xff0c;屏幕会卡在加载界面上&#xff0c;不得不重新启动。为了让电脑更加流畅&#xff0c;我已经将其更新到Windows 10版本&#xff0c;现在希望通过Win10更新清理来进一步提升性能。请问如何进行Win…

【计算机组成】三分钟了解顺序存储、直接存储、随机存储和相联存储的区别

一.按地址访问和按内容访问的区别 按地址访问&#xff08;顺序存储、直接存储和随机存储&#xff09;&#xff1a;我知道这个数据存在哪个地址中&#xff0c;现在我把这个地址给你&#xff0c;麻烦你帮我找出我要的数据来 按内容访问&#xff08;相联存储&#xff09;&#xff…

12道c语言的课后习题!

1、计算n的阶乘&#xff08;1*2*3*4*5 n是个数&#xff0c;比如说乘到100&#xff1f;&#xff09; // 计算n的阶乘#include"stdio.h"int main() {int n 0;scanf("%d", &n);int i 0;int ret 1;for (i 1; i < n; i) {ret * i;}printf("…