摘自:https://blog.csdn.net/abc039510/article/details/88421490?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control
广角镜头的标定、畸变校正和基于ROS的实时视频输出
whu-hk 2019-03-12 15:19:47 1542 收藏 9
分类专栏: 相机标定 ROS包 文章标签: 广角镜头 ROS启动包 标定与畸变校正 鱼眼模型
版权
参考网址:
1.棋盘格标定 https://blog.csdn.net/u011475210/article/details/79185543
2.镜头参数调整 https://blog.csdn.net/akay1997/article/details/76421757/
3.实时畸变校正 https://blog.csdn.net/lcydhr/article/details/72726396
一.标定
鱼眼相机成像模型不同于普通镜头的针孔成型模型。 广角镜头介乎于普通镜头与鱼眼镜头之间,畸变程度也介乎两者之间。 本人采用3.6mm、全视角范围90°的一款广角镜头,之前采用普通镜头的标定方法效果不是很理想,转向OpenCV3版本引入的fisheye模型:
内参矩阵、坐标轴倾斜系数skew等属性与普通镜头相同,不同的是畸变系数。畸变主要分径向与切向两种,径向畸变发生在相机坐标系转图像物理坐标系的过程中。而切向畸变是发生在相机制作过程,其是由于感光元平面跟透镜不平行。
普通镜头的畸变参数:k1,k2,k3——径向畸变系数,p1,p2——切向畸变系数。
鱼眼镜头的畸变系数:k1,k2,k3,k4
标定程序源码参考Visual Studio工程github代码地址
二.畸变校正
cv::fisheye提供两种畸变校正方法:
(1) initUndistortRectifyMap + Remap;
(2) undistortImage
API具体信息参考OpenCV官网,需要说明的是第二种其实是第一种方法的组合,但在具体应用方面需要注意的是,第一种initUndistortRectifyMap计算原图与畸变校正图之间的变换即map1和map2,这两个参数可以只计算一次作为全局变量,只要镜头的分辨率等信息不改变,后续进行Remap操作即可,而第二种方式多应用于单张图片的畸变校正,用于视频流的畸变校正则大大影响实时效率,因为每一帧图像都重新计算了map1与map2。
三.基于ROS的多分辨率视频输出
本文采用的镜头支持多种分辨率,主要为640x480/1280x720/1920x1080三种。16:9的宽高比容易获得较宽的视野,但需要改变视频流的编码方式,改为‘mjpg’格式,4:3则视野较窄,‘yuyv’格式编码即可。通过将分辨率的宽和高分别作为参数写入ROS的launch文件中,实现多分辨率的不同roslaunch启动方式。
ROS包github地址:https://github.com/whu-hk/usb_cam_opencv
不同分辨率下镜头内参、畸变系数定义在/include/usb_cam_opencv/usb_cam_opencv.h中,根据自己镜头的参数调整。