Kinect2.0相机标定

我搜相机标定的时候有很多种方法,小白也不知道哪一个能用有用,感觉乱七八糟的,这个总结的很好Kinect2的标定和图像配准,我选的最简单的用matlab计算的。
下面是一些需要知道的基础知识,更好的操作和理解一些步骤吧(摘抄自上面那个博客)

相机结构

Kinect2.0相机标定_第1张图片
Kinect2.0相机标定_第2张图片
需要标定的参数:
Kinect2.0相机标定_第3张图片
标定方法和工具:
Kinect2.0相机标定_第4张图片

操作

参考: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,还有畸变参数

  1. 用相机拍摄不同角度的彩色图片(正视、俯视、仰视、左倾、右倾),不少于20张

注意:

  • 棋盘尽量覆盖在画面一半
  • 角度越多越好;
  • 棋盘要出现在图像的各个位置;
  • 平面与摄像头平面角度不要超过45°(我自己设置的时候发现角度太斜了红外图像就采集不到了,但是彩色摄像头可以,彩色图片也能采集到,但是不知道放在matlab里能不能识别格子的角点了,所以还是按照大家都这么做的做吧)
    参考的一篇博客说距离要2种及以上(我不知道距离远近有什么影响,反正我是照顾到红外相机太远了就采集不到,所以都离得比较近)

Kinect2.0相机标定_第5张图片
2. 把图片放到matlab里,就会自动计算出参数啦(matlab是通过检测棋盘格的角点然后计算相机参数的,虽然具体原理不太懂,不过这样至少知道拍摄的时候要注意什么,就是尽量把角点都显示全,让matlab容易捕捉)
调用matlab工具箱:
Kinect2.0相机标定_第6张图片
Kinect2.0相机标定_第7张图片
导入图片
Kinect2.0相机标定_第8张图片
会弹出一个框让你填写你的棋盘格单个格子的大小,我用的3cm的,所以改成30
Kinect2.0相机标定_第9张图片
然后会弹出一个框提示你一共输入了35张图片,识别并添加进matlab23张,有12张没有识别出来(反正就是不好用)被丢弃了。然后matlab就用这23张图片计算相机参数
Kinect2.0相机标定_第10张图片
Calibrate就可以开始计算相机参数啦
Kinect2.0相机标定_第11张图片
结果:
Kinect2.0相机标定_第12张图片
直接按确定:
Kinect2.0相机标定_第13张图片
Kinect2.0相机标定_第14张图片

标定红外摄像头

目的:获得彩色摄像头内参: 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位就没问题了,但是我直接用的这个图片好像也可以检测出来,就没有管),而且位置要求很苛刻,角度太大了或者太近都采集不到。
最后结果如下:
Kinect2.0相机标定_第15张图片
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

注意:参考博客里有说红外相机关照问题,一些图片要去掉
Kinect2.0相机标定_第16张图片

彩色图像和深度图像对齐

原理见下一节。
我选择第一对彩色和红外图像对应的外参矩阵,用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学习笔记(四)–深度图与彩色图对齐
Kinect2.0相机标定_第17张图片
点云图很明显的看到:
Kinect2.0相机标定_第18张图片

原理

基本推到看这个(我能看懂哈哈哈)kinect 2.0 SDK学习笔记(四)–深度图与彩色图对齐
这个原理很全,但是我没看,好复杂的样子:张正友标定法-完整学习笔记-从原理到实战

你可能感兴趣的:(Kinect2.0,Kinect2.0,相机标定)