前言
-
本教程涉及基础相机的原理,使用,标定,和读取。(注:本教程默认大家有ROS1基础,故不对程序进行详细解释)
-
上一期:[csdn博客]上手一个RGBD深度相机:从原理到实践–ROS noetic+Astra S(上):解读深度测距原理和内外参推导
-
距离上一期已经鸽了好久了,上一期我们讲到深度相机结构光测距的原理,同时推导了相机的内参矩阵和外参矩阵,这一期我们来讲讲如何对深度相机的RGB相机进行标定
-
本教程使用的环境
- ubuntu 20.04 LTS ROS1 noetic
- Astra S
1 相机标定
1-1 概念回顾
- 相机标定(Camera Calibration)是计算机视觉中的一个基本步骤,其目的是确定相机的内参(internal parameters)和可能的外参(external parameters)。内参包括焦距(focal length)、主点(principal point)、畸变系数(distortion coefficients)等,而外参则包括相机的位置和方向。
- 回顾上一次推导的结果
1-2 标定板
-
标定板(Calibration Board)是相机标定过程中使用的物理图案,用于确定相机的内部和外部参数。标定板上的图案可以是棋盘格、圆点或其他可识别的模式。
-
类型
-
棋盘格(Chessboard):这是最常用的标定板类型,通常由黑白相间的方格组成。棋盘格的角点易于检测,并且可以提供丰富的特征点用于标定计算。
-
圆点(Circle Grid):这种标定板由均匀分布的圆点组成,同样易于检测,并且在某些情况下可能比棋盘格更易于处理。
-
AprilTag:这是一种特殊的二维码,包含了编码信息,可以用于更高级的相机标定和增强现实应用。
-
-
使用
- 在相机标定过程中,标定板被放置在已知位置,相机从多个角度拍摄标定板的图像。通过分析这些图像中的特征点,可以计算出相机的内部参数(如焦距、主点和畸变系数)和外部参数(如旋转矩阵和平移向量)。
-
这里我使用的是现成玻璃材质的标定板
- 图中左下角有
GP400 12*9-30
的字样- GP400:标定板的型号
- 12*9:棋盘格的大小,即12行和9列的方格。
- 30:每个方格的尺寸,30mm
- 图中左下角有
-
下面我们看看如何使用这个棋盘格对相机的内参矩阵进行标定。
2 camera-calibration
2-1 介绍
- camera_calibration 是 ROS 提供的一个相机标定工具包,适用于单目和双目相机的标定。它使用棋盘格作为标定板,而非 AprilTag。该工具包基于 OpenCV 的原理,能够方便地估计相机的内部参数(如焦距、主点和畸变系数)和外部参数(如旋转矩阵和平移向量)
2-2 安装
- 新开一个终端,我们直接安装即可
sudo apt install ros-$ROS_DISTRO-camera-calibration
2-3 RGB标定
-
老规矩我们连接好相机,打开驱动程序(astra.launch)
-
标定程序需要订阅到摄像头话题,回顾上一节的内容,我们需要订阅的是
/camera/color/image_raw
-
运行标定程序
rosrun camera_calibration cameracalibrator.py --size 8x11 --square 0.030 image:=/camera/color/image_raw
-
--size 8x11
:注意这里填的不是棋盘格的行列数,是内部角点的行列数 -
--square 0.030
:每一小格的边长 -
image:=/camera/color/image_raw
:图像话题
-
-
上述程序运行后会弹出如下窗口
-
相机类型选择
- Camera type摄像头类型:,这里我们选择0
- 0 pinhole针孔
- 1 fisheye鱼眼
- scale:比例,设置为1即可
- Camera type摄像头类型:,这里我们选择0
-
我们来看右侧这四个进度条
- X:棋盘格在摄像头视野中的左右移动
- Y:棋盘格在摄像头视野中的上下移动
- Size:棋盘格在摄像头视野中的前后移动
- Skew:棋盘格在摄像头视野中的倾斜转动
-
我们需要不断移动棋盘格,不断采集四个进度条的数据,当数据采集完成时候,
CALIBRATE按钮会变色
(尽量让四个条都变成绿色) -
依次点击
CALIBRATE
,标定完成后SAVE
和COMMIT
会亮起,点击SAVE
进行保存,点击COMMIT
进行提交关闭程序
-
终端可以看到标定的结果和标定文件保存的位置
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
-
我们打开ost.yaml
image_width: 640
image_height: 480
camera_name: narrow_stereo
camera_matrix:rows: 3cols: 3data: [524.2458 , 0. , 320.59801,0. , 522.832 , 240.49402,0. , 0. , 1. ]
distortion_model: plumb_bob
distortion_coefficients:rows: 1cols: 5data: [0.016076, -0.099965, 0.000828, -0.000928, 0.000000]
rectification_matrix:rows: 3cols: 3data: [1., 0., 0.,0., 1., 0.,0., 0., 1.]
projection_matrix:rows: 3cols: 4data: [519.10468, 0. , 319.54747, 0. ,0. , 521.18512, 240.27539, 0. ,0. , 0. , 1. , 0. ]
- image_width 和 image_height:即图像的宽度和高度
- camera_name:这是相机的名称 “narrow_stereo”。
- camera_matrix:相机矩阵(也称为内参矩阵)描述了相机的内部参数。
- distortion_model:畸变模型描述了镜头的畸变类型。这里使用了 “plumb_bob” 模型,这是一种简化的径向畸变模型。
- distortion_coefficients:畸变系数是与畸变模型相关的参数,用于校正镜头的畸变。这里有五个畸变系数:k1, k2, p1, p2, k3。这些系数用于校正镜头的径向和切向畸变。
- rectification_matrix:校正矩阵用于校正相机的图像,使其更适合于立体视觉应用。在这个例子中,校正矩阵是一个单位矩阵,意味着没有应用特定的几何校正。
- projection_matrix:
投影矩阵用于将三维空间中的点投影到二维图像平面上。在这个例子中,投影矩阵与相机矩阵非常相似,但可能包含了一些额外的变换,用于校正图像的几何失真。
2-4 RGB标定使用
- 根据上一节说的,在ros_astra_camera中,我们可以添加标定的结果到启动文件
<launch><!--...--><arg name="color_info_uri" default="file:///you_depth_camera_calib_path/rgb_camera.yaml"/><!--...-->
</launch>
-
我们观察以下默认的启动时候调用的默认标定文件
-
我们需要修改我们的标定文件摄像机的名字为
rgb_camera
image_width: 640
image_height: 480
camera_name: rgb_camera
- 同时我们修改启动文件的标定文件路径为我们存放标定文件的路径中
<arg name="color_info_uri" default="file:///home/zhlucifer2/ros-bicycle/src/ros_astra_camera/ost.yaml"/>
- 重新启动相机,可以看到我们的标定文件已经被使用了
小结
- 本节我们介绍了如何能使用
camera-calibration
进行RGB相机标定和启动 - 下一节我们讲讲我们该如何对深度相机进行标定
- 如有错误,欢迎指出!!!!感谢大家的支持!