ROS进行深度相机的标定


前言

自己使用标定板对深度相机进行标定。


参考:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration

一、准备标定板

在下面的网站中可下载棋盘格标定板,可用A4纸打印下来。
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf

二、使用ROS工具包进行标定

1. 打开相机

1.1 进入ROS内核

roscore

1.2 打开相机

roslaunch realsense2_camera demo_pointcloud.launch

2. 安装标定工具包

$ rosdep install camera_calibration

3. 查看话题

rostopic list

RGB图像的话题:
/camera/color/camera_info
/camera/color/image_raw
Depth图像的话题:
/camera/depth/camera_info
/camera/depth/image_rect_raw
注意:我的depth的为_rect_raw,在修改标定代码中的路径时要注意。

4. 运行标定代码

4.1 标定RGB相机

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.243 image:=/camera/color/image_raw camera:=/camera/color 

说明:

  • size:棋盘内部角点个数
  • square:棋盘格的单元格的边长,单位为m
  • image:图像的话题路径
  • camera:相机的信息路径

若是上面的代码报错:
“ Waiting for service /camera/color/set_camera_info …
Service not found “
则在上述代码后面加上”–no-service-check“:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0243 image:=/camera/color/image_raw camera:=/camera/color --no-service-check

即可进入标定界面:
在这里插入图片描述
上下左右移动标定板,当“CALIBRATE”变为绿色的时候,就可以了。
在这里插入图片描述点击“CALIBRATE”后,稍作等待,即可在终端看到标定的参数:
在这里插入图片描述

4.2 标定depth

注意此处的图像路径为“/camera/depth/image_rect_raw”。

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0243 image:=/camera/depth/image_rect_raw camera:=/camera/depth --no-service-check

目前还没有解决的问题:
深度相机标定depth要将红外发射器用不透光的材质的东西遮住,并且在黑暗环境下,用红外光照射
这里有两个红外摄像头,是否是要进行双目相机的标定?
双目相机标定官方文档:http://wiki.ros.org/camera_calibration/Tutorials/StereoCalibration
我的标定界面一片漆黑
我在网上见到的对深度图进行标定的相机都是kinect相机,而kinect有些型号的相机是基于TOF的,realsense d435是基于结构光的,有可能这是我进行深度图标定失败的原因。
改天试一试kinect。

5.标定参数的意义

ROS中的camera_calibration包,其代码实现主要使用了OpenCV中的calibration模块 。
得到的标定结果如下:

 = [0.23244826907781227, -0.08573299096457011, 0.05008213017343726, -0.08067275070179597, 0.0]
K = [1135.1350732747046, 0.0, 41.11323684505894, 0.0, 1067.9415171380786, 509.1845758553174, 0.0, 0.0, 1.0]
R = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P = [1086.77734375, 0.0, 18.500314902303217, 0.0, 0.0, 1084.970458984375, 527.9177954151601, 0.0, 0.0, 0.0, 1.0, 0.0]
None
# oST version 5.0 parameters


[image]

width
640

height
480

[narrow_stereo]

camera matrix
1135.135073 0.000000 41.113237
0.000000 1067.941517 509.184576
0.000000 0.000000 1.000000

distortion
0.232448 -0.085733 0.050082 -0.080673 0.000000

rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

projection
1086.777344 0.000000 18.500315 0.000000
0.000000 1084.970459 527.917795 0.000000
0.000000 0.000000 1.000000 0.000000

各标定参数的意义:
image_width、image_height代表图片的长宽
camera_name为摄像头名
camera_matrix规定了摄像头的内部参数矩阵
distortion_model指定了畸变模型
distortion_coefficients指定畸变模型的系数
rectification_matrix为矫正矩阵,一般为单位阵
projection_matrix为外部世界坐标到像平面的投影矩阵

6. 保存参数

点击SAVE,保存校准参数和校准中使用的图像。一切都将在压缩文件夹/tmp/calibrationdata.tar.gz中提供。

点击save,终端会出现:
在这里插入图片描述在此路径下会出现保存的文件:
在这里插入图片描述
里面存放的是标定的图片和求得参数的txt文件和yaml文件:
在这里插入图片描述

7. 创建yaml文件

Camera Calibration Parser帮助您创建一个 yml 文件,您可以使用camera_info_url参数加载几乎所有 ros 相机驱动程序。

8. 校正图像

简单地加载校准文件并不能纠正图像。要进行整改,请使用image_proc 包


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

猜你喜欢

转载自blog.csdn.net/weixin_44934373/article/details/129067568