我搜相机标定的时候有很多种方法,小白也不知道哪一个能用有用,感觉乱七八糟的,这个总结的很好Kinect2的标定和图像配准,我选的最简单的用matlab计算的。
下面是一些需要知道的基础知识,更好的操作和理解一些步骤吧(摘抄自上面那个博客)
参考:Kinect深度图与RGB摄像头的标定与配准(主要是参考的彩色相机的标定,还有最后对齐部分,红外相机看不太懂,我直接就拍了照片放在matlab里计算了)
kinect 2的数据获取与深度相机的标定(主要参考的matlab使用)
棋盘格下载
也可以去官网(应该是吧,反正好多人用这个):https://github.com/code-iai/iai_kinect2/tree/master/kinect2_calibration/patterns(这个只是最终的存放路径,只下载这个好像不行,需要返回找到整个项目然后把整个项目下载,再在文件夹里找图片)
目的:获得彩色摄像头内参: f x f_x fx, f y f_y fy, c x c_x cx, c y c_y cy,还有畸变参数
注意:
- 棋盘尽量覆盖在画面一半
- 角度越多越好;
- 棋盘要出现在图像的各个位置;
- 平面与摄像头平面角度不要超过45°(我自己设置的时候发现角度太斜了红外图像就采集不到了,但是彩色摄像头可以,彩色图片也能采集到,但是不知道放在matlab里能不能识别格子的角点了,所以还是按照大家都这么做的做吧)
参考的一篇博客说距离要2种及以上(我不知道距离远近有什么影响,反正我是照顾到红外相机太远了就采集不到,所以都离得比较近)
2. 把图片放到matlab里,就会自动计算出参数啦(matlab是通过检测棋盘格的角点然后计算相机参数的,虽然具体原理不太懂,不过这样至少知道拍摄的时候要注意什么,就是尽量把角点都显示全,让matlab容易捕捉)
调用matlab工具箱:
导入图片
会弹出一个框让你填写你的棋盘格单个格子的大小,我用的3cm的,所以改成30
然后会弹出一个框提示你一共输入了35张图片,识别并添加进matlab23张,有12张没有识别出来(反正就是不好用)被丢弃了。然后matlab就用这23张图片计算相机参数
Calibrate就可以开始计算相机参数啦
结果:
直接按确定:
目的:获得彩色摄像头内参: f x f_x fx, f y f_y fy, c x c_x cx, c y c_y cy,还有畸变参数
Kinect深度图片好像是又红外摄像头拍来的,所以标定红外摄像头就可以了。步骤同上,但是我采集到的红外图像很奇怪,画面是雪花状的(这个博主和我情况一样16位深度的TIF图像转8位深度——Matlab标定 一片白,可能保存成16位就没问题了,但是我直接用的这个图片好像也可以检测出来,就没有管),而且位置要求很苛刻,角度太大了或者太近都采集不到。
最后结果如下:
Camera Intrinsics
IntrinsicMatrix: [3×3 double]
FocalLength: [361.1934 362.1103]
PrincipalPoint: [261.9911 210.5512]
Skew: 0
RadialDistortion: [0.1103 -0.2990]
TangentialDistortion: [0 0]
ImageSize: [424 512]
Camera Extrinsics
RotationMatrices: [3×3×29 double]
TranslationVectors: [29×3 double]
Accuracy of Estimation
MeanReprojectionError: 0.3615
ReprojectionErrors: [35×2×29 double]
ReprojectedPoints: [35×2×29 double]
Calibration Settings
NumPatterns: 29
WorldPoints: [35×2 double]
WorldUnits: ‘millimeters’
EstimateSkew: 0
NumRadialDistortionCoefficients: 2
EstimateTangentialDistortion: 0
原理见下一节。
我选择第一对彩色和红外图像对应的外参矩阵,用matlab计算。
R_ir=[0.9956 , 0.0669 , 0.0653;%红外图像对应的外参,旋转矩阵
-0.0670 , 0.9978 , -0.0005;
-0.0652 , -0.0039 , 0.9979];
T_ir=[-119.979664484074 ;-116.048814672852; 460.315362680143];%红外图像对应的外参,平移矩阵
R_rgb= [0.9960 , 0.0589 , 0.0677;%彩色图像对应的外参,旋转矩阵
-0.0596 , 0.9982 , 0.0077;
-0.0671 , -0.0117 , 0.9977];
T_rgb=[-68.7625339843484; -113.548684529554 ;465.147009166948];%彩色图像对应的外参,平移矩阵
R=R_rgb*inv(R_ir);%计算ir2rgb旋转矩阵
T=T_rgb-R*T_ir;%计算ir2rgb平移矩阵
然后就是用输入图像和内参外参计算出来的旋转平移矩阵,然后根据公式编程,最后输出图像啦。程序见:kinect 2.0 SDK学习笔记(四)–深度图与彩色图对齐
结果:还是会有重影?(有部分颜色在墙上。。。)这个还是我手动平移之后比较好的结果,可能是我只用了一对图像的外参,不够精确?
哦我参考的这个博客里有原因,好像是深度摄像头和彩色摄像头视差的原因,有盲区,重影这部分是深度摄像头能看到但是彩色看不到的,怎么对都不会有相应的彩色对应的,所以可能就用了原来彩色图中的颜色覆盖住了?kinect 2.0 SDK学习笔记(四)–深度图与彩色图对齐
点云图很明显的看到:
基本推到看这个(我能看懂哈哈哈)kinect 2.0 SDK学习笔记(四)–深度图与彩色图对齐
这个原理很全,但是我没看,好复杂的样子:张正友标定法-完整学习笔记-从原理到实战