<>写在前面

1. 你用什么数据标定的就用对应的内参,如果缩放了图像就要同时缩放内参(包括fx,fy,cx,cy,d0,d1,d2,d3,d4)。
(比如说:我程序中用的是1920x1080的图像,那我就是需要用在HD=1920x1080下标定的内参,标定时采集的图像也应该是1920x1080的)
**备注:**相机内参主要是fx fy cx cy。其中cx cy表示图像中心点,下采样后,均按比例缩小。fx 表示f*a 其中f表示焦距 a表示底片中
1m内含有多少个像素。当图像下采样后,f没变,但a随比例正比变化,所以fx fy也按比例减小。--图像下采样后对应的相机内参矩阵怎么变?
<https://www.zhihu.com/question/47746801/answer/394605540>

2.标定时应该选择光照充足的环境(开始标定彩色相机时纳闷为什么一直捕捉不到,后来实验室加开了一排灯后效果明显变好,坑啊,,)

3. 从标定流程中可以看出,我们不同相机的内参以及配准的标定是需要依次分别进行的,即标定完一个相机,再采集下一个相机的图像进行标定。

4.若选择标定板的尺寸不同记得更改程序

5. 深度相机测量范围:0.5 ~ 4.5 m

6. 关于单位:内参矩阵的单位是像素;由于fx=f/dx,dx:mm/Pix,故(u,v)单位是像素,图像归一化坐标系(x,y)及其之后的单位是mm
;尺度因子相当于Zc的长度;重投影误差单位为像素。

7.标定结果的储存与说明(/home/junwang/catkin_ws/src/iai_kinect2/kinect2_bridge/data):
calib_color.yaml :彩色相机的内参和畸变
calib_depth.yaml :depthShift: -4.2799976633573998e+01??
calib_ir.yaml :彩色相机的内参和畸变
calib_pose.yaml:配准数据

8.在启动相机时调用标定的数据:
首先,寻找符合序列号(010733764647)的文件夹中的数据;
[Info] [Freenect2Impl] found valid Kinect v2 @2:7 with serial
010733764647//标定后的数据的存放位置
如若没有,则按照data文件夹中文件名的排序进行调用。

<>使用iai_kinect2標定说明

在ubuntu下使用KinectV2需要做两件事情,一是,编译KinectV2自带的开源驱动libfreenect
;二是,使用Kinect2_bridge在ROS下采集他的图像。

iai_kinect中含有四个模块,我们主要用他的bridge进行图像间的转换;此外,还要使用kinect2_registration进行标定。


标定之后呢,会得到kinect2彩色头、深度头、红外头的内参和外参,它们都以yaml模式存储在你的机器内。kinect2_bridge会自动检测你的标定文件**(自动是按data文件夹中的内参命名顺序调用)**,对深度图进行校正。之后slam过程主要使用彩色头的内参哦!

参考:http://www.cnblogs.com/gaoxiang12/p/5161223.html
<http://www.cnblogs.com/gaoxiang12/p/5161223.html>

<>具体流程:

https://github.com/code-iai/iai_Kinect2
<https://github.com/code-iai/iai_Kinect2>
https://github.com/code-iai/iai_kinect2/tree/master/kinect2_calibration
<https://github.com/code-iai/iai_kinect2/tree/master/kinect2_calibration>

install the dependencies
//略,见其上网址详细说明教程
build it:
cd ~/catkin_ws catkin_make -DCMAKE_BUILD_TYPE="Release"
Connect your sensor and run kinect2_bridge:
roslaunch kinect2_bridge kinect2_bridge.launch
Calibrate your sensor using the kinect2_calibration详细步骤:
#新终端 rosrun kinect2_bridge kinect2_bridge
_fps_limit:=2//以每秒少的帧数启动kinect2_bridge(以便在您的CPU上轻松实现) #新终端 mkdir
~/kinect_cal_data; cd ~/kinect_cal_data//为校准数据文件创建一个目录 rosrun
kinect2_calibration kinect2_calibration chess7x9x0.025 record color//记录彩色摄像机的图像
//出现这样的错误提示是无妨的【Erro:Tried to advertise a service that is already advertised in
this node 】[/kinect2_calib_1545719733756453834/compressed/set_parameters]
//出现图像窗口后,按空格键开始收集图片即可 rosrun kinect2_calibration kinect2_calibration
chess7x9x0.025 calibrate color//校准内参矩阵 rosrun kinect2_calibration
kinect2_calibration chess7x9x0.025 record ir//记录红外摄像机的图像 rosrun
kinect2_calibration kinect2_calibration chess7x9x0.025 calibrate
ir//校准红外摄像机的内参矩阵 rosrun kinect2_calibration kinect2_calibration chess7x9x0.025
record sync//在两台摄像机上同步录制图像: rosrun kinect2_calibration kinect2_calibration
chess7x9x0.025 calibrate sync//校准配准矩阵 rosrun kinect2_calibration
kinect2_calibration chess7x9x0.025 calibrate depth//校准深度测量:
通过查看kinect2_bridge打印出的第一行,找出kinect2的序列号,这部分看起来像这样(此为我的设备序列号):
device serial: 010733764647
在kinect2_bridge / data / $ serial中创建校准结果目录:
roscd kinect2_bridge/data; mkdir 010733764647
将以下文件从校准目录(〜/ kinect_cal_data)复制到刚刚创建的目录中: calib_color.yaml calib_depth.yaml
calib_ir.yaml calib_pose.yaml

重启kinect2_bridge并对更好的数据感到惊讶
cd ~/catkin_ws/ #运行kinect2_bridge roslaunch kinect2_bridge
kinect2_bridge.launch #打开一个新终端,查看点云图 rosrun kinect2_viewer kinect2_viewer sd
cloud

注意:kinect2_calibration.cpp不需要改任何参数,目前的calibration版本不需要认为调整,存的参数文件为K2_TOPIC_HD下的参数,但在用qhd或sd分辨率时,会自动转换为相应的内参(用QHD校正了很多次,看camera_info的出来的结论!)
https://blog.csdn.net/Siyuada/article/details/78981555
<https://blog.csdn.net/Siyuada/article/details/78981555>
正解啊!!!!

<>注意事项

* 校准图案非常平坦非常重要,否则误差很大。
* 用卡尺检查印刷图案的特征之间的距离是否正确,chess5x7x0.03校验:黑色和白色角的交叉点之间的距离应精确到3厘米。
* 拍摄图像时,传感器稳定
(图像清晰且不模糊)非常重要,因为图像不是同时拍摄的,手中握着他们并不好,三脚架将专门帮助您确保传感器在IR和RGB图像拍摄之间没有移动【特别是对于外部校准】。
* 图像中标定板与相机的相对位姿,一般要让标定板占据整张图像的一半左右面积(远距离可以保证么?)
* 我通常使用0.6到2.5米之间的距离,近中远;要走得更远,你需要一个更大的棋盘,但是你不能离得更近。
* A4纸太小了,要是有机会尽量用大点的纸吧。
<>无影响

拍摄照片的先后顺序--经试验,小数点后前五位都是一样的,随机抽掉一张结果影响也不大
选用棋盘格的类型大小--单目不影响(尺度不变性),双目需指定
标定板的位姿对标定结果影响比标定照片数目的影响
大得多。(按照张正友标定法原文,拍照顺序是从正对图像开始,每次选择一个坐标轴,旋转45度的角度,拍摄16幅左右的图片就可以,但是感觉可以角度小一点)
参考:http://www.yanglajiao.com/article/lxy_2011/54313799
<http://www.yanglajiao.com/article/lxy_2011/54313799>

<>采集过程

放置图案非常重要,这些图片较少,或者与图案类似的许多图像可以获得良好的重投影误差,但校准不好。我通常通过以下步骤捕获大约100 - 200张图像:
将图案放置在相机附近;将图案放置在图像的左上角;在拍照时沿着该行移动往下走一排,然后进行第三步;直到你最终在右下角。
在距离(<= 1m),中距离(> 1m,<2.5m)和远(> = 2.5m)的3个不同距离进行【距离取决于棋盘尺寸】

我们通常从一个短距离开始;并且标定板相对于相机要有正视、仰视、俯视、左斜视和右斜视等,想象一下从相机传感器射出的光线,这可以确保您拥有校准图案不垂直于该光线的图像。
按照张正友标定法原文,拍照顺序是从正对图像开始,每次选择一个坐标轴,旋转45度的角度,拍摄16幅左右的图片就可以,但是感觉可以角度小一点。

参考:
https://blog.csdn.net/zilanpotou182/article/details/68491447
<https://blog.csdn.net/zilanpotou182/article/details/68491447>
https://blog.csdn.net/hehedadaq/article/details/79559310
<https://blog.csdn.net/hehedadaq/article/details/79559310>

<>标定结果分析

re-projection error
在标定的时候我们经常用到重投影误差作为最终标定效果的评价标准,根据优化的准则我们知道,重投影误差越小,就说相机标定的精度越高。

重投影误差:指的真实三维空间点在图像平面上的投影(也就是图像上的像素点)和重投影(其实是用我们经过外参估计后的计算值得到的虚拟的像素点)的差值,单位:像素。
Bundle adjustment优化,即为最小化重投影误差
参考:https://www.cnblogs.com/Jessica-jie/p/7739775.html
<https://www.cnblogs.com/Jessica-jie/p/7739775.html>

Pixel Error(像素误差):指的是在x和y方向上以像素为单位的重投影误差的标准差.

<>BUG整理

1.执行roslaunch kinect2_bridge kinect2_bridge.launch出现下面的错误:
[kinect2_bridge.launch] is neither a launch file in package [kinect2_bridge]
nor is [kinect2_bridge] a launch file name
解决方案:检查3个依赖项是否安装,依赖包括:ROS Indigo (注意:ROS Indigo的iai_kienect包和ROS Kinect的
iai_kinect包不是一个) ,OpenCV 2.X,(注意:OpenCV3.X不能使iai_kinect正常工作),PCL1.7.
x 【更新后关机重启才完美解决,每次运行launch文件都必须要运行source devel/setup.bash启动文件】

2.执行rosrun kinect2_viewer kinect2_viewer出现问题:
[rospack] Error: package 'kinect2_viewer' not found
解决:也是需要先配置ROS工作环境,在catkin_ws文件夹下执行source devel/setup.bash即可。
在新打开的终端里面要重新配置工作环境(ubuntu特性)
ps:一劳永逸的办法,执行gedit ~/.bashrc打开.bashrc配置文件,在最后加入source
/home/XXXX(你的用户名主文件夹)/catkin_ws/devel/setup.bash即可每次打开终端时自动执行。
参考:https://blog.csdn.net/sinat_36171220/article/details/77860078
<https://blog.csdn.net/sinat_36171220/article/details/77860078>

3.运行rosrun kinect2_calibration kinect2_calibration chess5x7x0.03 record
color时出现:
[ERROR] Tried to advertise a service that is already advertised in this node
[/kinect2_calib_1458721837266890808/compressed/set_parameters]
解决方案:检查一下你的棋盘格板是不是按照标定标准设置的,如果标定程序已经检测到了你棋盘格板,选定标定显示窗口,按空格即可;点击图像界面,同时按空格键保存

4.标定深度的时候出现:
[ERROR] [DepthCalibration::compareDists] no distance sample data!
解决方案:没有数据的意思,需要记录前的三种数据,每种100张,需要至少两种距离

<>备注:

1.相机外参 Vs 手眼标定
相机外参:是相机坐标系和世界坐标系之间的对应关系;
手眼标定:是相机和机械手之间的关系。
如果将世界坐标系和机械手坐标系重合?

2.採用QHD分辨率使用kinect2_calibration
参考:
https://hk.saowen.com/a/6a4c27b2513f41ddf7017e4e789ba2bd1ff49c956ebb69951faffcd04998fc91

<https://hk.saowen.com/a/6a4c27b2513f41ddf7017e4e789ba2bd1ff49c956ebb69951faffcd04998fc91>
1)修改kinect2_calibration.cpp文檔如下:
a)K2_TOPIC_HD 改為 K2_TOPIC_QHD
b)把文檔中涉及到分辨率1920x1080都改成960x540,這一步非常重要,不然校正出來的內參還是按照HD分辨率進行校正
2)編譯進程
cd ~/catkin_ws
catkin_make -DCMAKE_BUILD_TYPE=“Release”
參考“http://www.bubuko.com/infodetail-2151412.html”
<http://www.bubuko.com/infodetail-2151412.html%E2%80%9D>
参考:http://www.mamicode.com/info-detail-1886444.html
<http://www.mamicode.com/info-detail-1886444.html>
1311-1313这三行命令:
std::string topicColor = “/” + ns + K2_TOPIC_HD + K2_TOPIC_IMAGE_MONO;
std::string topicIr = “/” + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_IR;
std::string topicDepth = “/” + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_DEPTH;
正好和上面的输出信息对应:
Topic color: /kinect2/hd/image_mono
Topic ir: /kinect2/sd/image_ir
Topic depth: /kinect2/sd/image_depth
因此把 K2_TOPIC_HD 改为 K2_TOPIC_QHD 即可。保存。然后重新编译

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信