摄像头为什么要标定
摄像头是一种非常精密的光学仪器,它对外界环境的感知是非常敏感的。由于摄像头内部和外部的一些原因,生成的物体图像常常会发生一定的畸变,例如在鱼眼摄像头,畸变是非常大的,如果直接将采集到的图像拿来进行图像处理的话,会产生很大的问题,为了避免数据源造成的误差,需要针对摄像头的参数进行标定。
安装标定功能包
选择适合自己的ROS版本进行安装
//如果indigo版本
sudo apt-get install ros-indigo-camera-calibration
//如果kinetic版本
sudo apt-get install ros-kinetic-camera-calibration
将文件robot_vision下载 解压 到catkin_ws/src下面。 文件地址:云盘地址 提取码:csic
使用外部工具
棋盘格标定靶:
普通摄像头标定流程
1.启动摄像头
roslaunch robot_vision usb_cam.launch
此时虽然摄像头启动,并不会有可视化界面显示 。
2.启动标定包 打开新的终端窗口,输入以下命令:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/usb_cam/image_raw camera:=/usb_cam
命令解析: 1.size :标定棋盘个的内部角点个数,这里实用的棋盘一共有6行,每行有8个内部角点(不包括最外围的一圈棋盘格); 2.squre:这个参数对应每一个棋盘格的边长,单位是米,棋盘格打印出来以后要自己再测量一下打印的是或否准确然后自己更改。 3.image和camera:设置摄像头发布的图像话题。 显示结果:
3.打印棋盘格 然后打开刚下载的robot_visiion文件下面doc文件夹下有标定需要的棋盘格的pdf文件,可以打印出来。 4.相机标定 将打印好的棋盘格放入摄像头的视野范围内,不断调整与摄像头的距离,慢慢旋转棋盘格,左右移动棋盘格,不断变换位置。
当标定靶移动测试成功后,在可视化页面中的第一个按键将从灰色变为深绿色,说明标定已经结束。
上面的X Y Size Skew分别为: X:标定靶在摄像头视野中的左右方向移动。 Y:标定靶在摄像头视野中的上下方向移动。 Size:标定靶在摄像头视野中的前后方向移动。 Skew:标定靶在摄像头视野中的倾斜转动。 当变为绿色的时候表示这个参数已经标定成功。可以在命令窗口中看到当前标定的数据。
接下来点击深绿色的CALIBRATE按键,等待程序计算出相机的标定参数(此时界面会卡顿,千万不要关掉,要等待后天进行计算),直到三个按键都变为深绿色。 点击SAVE可以讲标定的数据保存,在命令终端上可以看到保存到的文件路径,同时命令终端上也会显示标定的结果
此时摄像头的标定已经结束。 解压缩生成的文件压缩包,可以看到当中有很多采集到的图像的照片,其中最重要的是ost.yaml文件。 打开ost.yaml文件看一下,里面有很多参数。
将ost.yaml拷贝到robot_vision下,可以自己重命名。
Kinect标定流程
标定以前确保ROS可以打开运行KInect,我是用的是KInect 2.0 版本,如何进行配置可以参考我以前的博客《 Ubuntu14安装kinect驱动配置》 下面为kinect 1.0 版本的标定方法: 1.启动Kinect
roslaunch robot_vision freenect.launch
2.启动彩色摄像头进行标定
rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.0245
3.启动红外摄像头进行标定
rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera/ir --size 8x6 --square 0.0245
标定的步骤与普通相机的标定步骤相同,当彩色摄像头和红外摄像头全部标定完毕之后,产生的压缩文件中有两个标定的文件。这两个文件都会在后续当中使用。 下面为kinect 2.0版本的标定方法: 需要标定四样东西:彩色图像(color)、红外图像(ir)、帧同步(frame) 、深度图像(depth) 1.运行ROS
roscore
2.新建一个文件夹temp存放将要生成的文件和保存的图片。
mkdir ~/temp
cd temp
3.启动ROS的kienct 2的驱动 再打开一个命令终端
rosrun kinect2_bridge kinect2_bridge _fps_limit:=2
其中 _fps_limit:=2 是限制使用频率,也可以直接使用命令 rosrun kinect2_bridge kinect2_bridge
运行这条命令后注意查看设备串口号,我的设备串口号是这样的:00080426467。在自己的catkin_ws/src/iai_kinect2/kinect2_bridge/data这个文件夹下面新建一个文件夹,名称以自己的设备串口号命名。 4.开始进行标定 标定彩色图像:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 record color
不断调整棋盘格的位置姿态,按空格键保存图片,多保存一些分析得到的数据更准,我保存了40个左右。 等数据采集完成后,打开新的命令终端,输入一下指令来使后台开始计算相机参数:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 calibrate color
等后台计算结束后就会在终端显示结果:
打开Temp文件夹,我们就可以看到采集到的图像,每次识别到的点,以及生成的最重要的相机参数文件 calib_color.yaml
打开 calib_color.yaml文件可以看到相应参数:
接下来使用同样的方法对红外图像进行标定:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 record ir
不断调整棋盘格的位置姿态,按空格键保存图片。等数据采集完成后,打开新的命令终端,输入一下指令来使后台开始计算相机参数:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 calibrate ir
会生成calib_ir.yaml 文件。 使用同样的方法对帧同步进行标定:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 record sync
不断调整棋盘格的位置姿态,按空格键保存图片。等数据采集完成后,打开新的命令终端,输入一下指令来使后台开始计算相机参数:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 calibrate sync
会生成calib_pose.yaml 文件。 对深度进行标定:
rosrun kinect2_calibration kinect2_calibration chess8x6x0.0245 calibrate depth
深度标定此时执行此指令会生成calib_depth.yaml 文件
拷贝文件
然后再把calib_color.yaml calib_ir.yaml calib_pose.yaml calib_depth.yaml拷贝到catkin_ws/src/iai_kinect2/kinect2_bridge/data/00080426467文件夹中标定搞定。