目录
2.以每秒较低的帧数启动kinect2_bridge(以便于 CPU 使用)
9、在kinect2_bridge/data文件夹中创建校准结果目录
10、将以下文件从校准目录(在第三步创建)(~/kinect_cal_data) 复制到刚刚创建的目录中
注:默认电脑已经安装好kinect2相机的libfreenect2驱动和iai_kinect2包,没有安装的可以看我的上一篇文章:Ubuntu18下Kinect2的驱动libfreenect2安装以及iai_kinect2安装(亲测可用)_ssz__的博客-CSDN博客
在相机标定前思考一个问题,为什么需要对相机进行内参标定?可以参考这些文章:
【一文弄懂】张正友标定法-完整学习笔记-从原理到实战_hehedadaq的博客-CSDN博客
kinect2相机标定在github也有官方的参考例程:iai_kinect2/kinect2_calibration at master · code-iai/iai_kinect2 · GitHub
kinect v2硬件结构:微软把Kinect v2形象的描述为有“三只眼睛”和“四只耳朵”。
三只眼睛:
1080P 30FPS RGB彩色镜头:用来拍摄视角范围内的彩色视频图像。
0.5-4.5m毫米级深度摄像头:分析红外光谱,创建可视范围内的人体、物体的深度图像。
30FPS 16bit红外投影机:主动投射近红外线光谱,照射到粗糙物体、或是穿透毛玻璃后,会形成随机的反射斑点,称之为散斑。进而能够红外摄像头读取。
四只耳朵:
四元线性麦克风阵列:声音从4个麦克风采集,内置数字信号处理DSP等组件,同时过滤背景噪声,可定位声源方向。
相机内参标定流程:
一、准备标定板
我的标定板棋盘格角点是11*8*0.03,也可以选择官方的棋盘格(在github例程里下载),把棋盘格固定在一块平整的板子上。
相机标定过程中需要固定相机位置,移动标定板,标定板的位置尽量不要平行,否则采集的这个数据将无效。
光线不要太强,否则会对标定效果产生影响,有条件的最好别用打印机打印的,直接网上买标定板,我的是使用网上买的。
二、标定步骤:
1、输入下面命令来获取kinect数据
roslaunch kinect2_bridge kinect2_bridge.launch
2.以每秒较低的帧数启动kinect2_bridge(以便于 CPU 使用)
rosrun kinect2_bridge kinect2_bridge _fps_limit:=2
3、为校准数据文件创建目录
mkdir ~/kinect_cal_data
cd ~/kinect_cal_data
4、彩色相机拍摄与矫正
source ~/catkin_ws/devel/setup.bash
//记录彩色相机的图像,空格记录
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 record color
//校准内参矩阵
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 calibrate color
在record时调整标定板位置,以便拍下不同位置的图片(最好20张以上,我保存了23张,当然图片保存越多越好),按一下键盘空格键就可以保存一张图片,当保存20多张后,在终端输入CTRL+C即可退出。
5、红外相机拍摄与矫正
//记录红外相机的图像,空格记录
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 record ir
//校准红外相机的内参矩阵
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 calibrate ir
在record时调整标定板位置,以便拍下不同位置的图片(最好20张以上,我保存了23张,当然图片保存越多越好),按一下键盘空格键就可以保存一张图片,当保存20多张后,在终端输入CTRL+C即可退出。
6、在两台相机上同步录制图像
//在两个相机上同步录制图像,空格记录
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 record sync
//校准配准矩阵和外在因素
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 calibrate sync
在record时调整标定板位置,以便拍下不同位置的图片(最好20张以上,我保存了23张,当然图片保存越多越好),按一下键盘空格键就可以保存一张图片,当保存20多张后,在终端输入CTRL+C即可退出。
7、校准深度测量值
//校准深度测量
rosrun kinect2_calibration kinect2_calibration chess11x8x0.03 calibrate depth
标定之后,会得到kinect2彩色头、深度头、红外头的内参和外参,它们都以yaml模式存储在校准目录内
8、查看序列号
通过查看kinect2_bridge打印出来的第一行,找出 kinect2 的序列号(大概在第一个窗口的三分之一位置)。该行如下所示:(后面的序列号每个人的会不一样,下面是我的序列号)
device serial: 003049564947
9、在kinect2_bridge/data文件夹中创建校准结果目录
roscd kinect2_bridge/data;
mkdir 003049564947
10、将以下文件从校准目录(在第三步创建)(~/kinect_cal_data) 复制到刚刚创建的目录中
calib_color.yaml
calib_depth.yaml
calib_ir.yaml
calib_pose.yaml
11、重启kinect_bridge,比较前后运行结果:
roslaunch kinect2_bridge kinect2_bridge.launch #连接传感器
rosrun kinect2_viewer kinect2_viewer kinect2 qhd image #查看四分之一高清图
rosrun kinect2_viewer kinect2_viewer kinect2 qhd cloud #查看四分之一高清点云
三、标定前后效果比对
qhd image(标定前)(depth图和RGB图叠加)
qhd image after(标定后)(depth图和RGB图叠加)
从两图中可以看到,没标定过的kinectv2,深度图和彩色图之间是不保证对应的。例如图中我打箭头的三处地方,而标定后可以看出两个窗户的边缘和门帘的右侧边缘深度图和RGB图基本对应。有点彩色图往左偏移的感觉(注:只是感觉,不知道对不对)(根据github中的README可以知道深度图与RGB图大概偏移了24mm)
qhd cloud(标定前)(点云图)
qhd cloud after(标定后) (点云图)
从以上两图中可以看出,点云图和RGBD图的偏移效果一样,从图中我标记的三个箭头可以看到黑色的东东向左偏移了,应该也是偏移了24mm左右。
四、总结
1、点云和深度图的区别:
1.深度图像也叫距离影像,是指将从图像采集器到场景中各点的距离(深度)值作为像素值的图像。获取方法有:激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法。
2.点云:当一束激光照射到物体表面时,所反射的激光会携带方位、距离等信息。若将激光束按照某种轨迹进行扫描,便会边扫描边记录到反射的激光点信息,由于扫描极为精细,则能够得到大量的激光点,因而就可形成激光点云。点云格式有*.las ;*.pcd; *.txt等。
深度图像经过坐标转换可以计算为点云数据;有规则及必要信息的点云数据可以反算为深度图像。
2、对标定产生的yaml文件数据理解:
可以参考这篇文章:
关于iai_kinect2中标定数据的个人理解_YQ8023family的博客-CSDN博客
标定产生的plot.dat文件可以查看computed depth和measure depth之间的误差
3、遇到的错误
做的时候还遇到一个错误,不过好像并没有影响标定过程:
[ERROR] Tried to advertise a service that is already advertised in this node [/kinect2_calib_1458721837266890808/compressed/set_parameters]
[ERROR] Tried to advertise a service that is already advertised in this node [/kinect2_calib_1458721837266890808/compressed/set_parameters]
4、相机标定结果评估
单目相机标定结果的评估——重投影误差与畸变校正_重投影误差和反投影误差的区别_黑化咸鱼的博客-CSDN博客
相机标定评价标准_相机标定结果的好坏_谜之_摄影爱好者的博客-CSDN博客
标定结果评估可以看上面两篇文章,后面可能会做机械臂的手眼标定,我觉得相机内参标定的结果会影响机械臂的抓取效果,等待后面进行验证。
参考资料及视频
相机标定(Camera calibration)原理、步骤_XDWX的博客-CSDN博客
Kinect v2.0 在ubuntu 16和ROS中的驱动安装和内参标定_kinectv2内参_合工大机器人实验室的博客-CSDN博客