kinect和联想E460自带相机标定

我打算用MATLAB进行标定
我在Ubuntu14.04下安装MATLAB
参考博客:
http://www.cnblogs.com/nowornever-L/p/5649078.html
在这个问题当中遇到的问题:
这里写图片描述
这个地方我是做不出来,后来又找了找资料
kinect和联想E460自带相机标定_第1张图片

tip: 快速打开system monitor 的命令:$ gnome-system-monitor

然后显示挂载点之后,进入安装界面后
kinect和联想E460自带相机标定_第2张图片
kinect和联想E460自带相机标定_第3张图片
kinect和联想E460自带相机标定_第4张图片
kinect和联想E460自带相机标定_第5张图片
kinect和联想E460自带相机标定_第6张图片
kinect和联想E460自带相机标定_第7张图片
kinect和联想E460自带相机标定_第8张图片
kinect和联想E460自带相机标定_第9张图片
kinect和联想E460自带相机标定_第10张图片
kinect和联想E460自带相机标定_第11张图片
kinect和联想E460自带相机标定_第12张图片
kinect和联想E460自带相机标定_第13张图片
kinect和联想E460自带相机标定_第14张图片
然后在跟着那个博客链接,吧那个文件复制进那个文件夹当中,就可以了
kinect和联想E460自带相机标定_第15张图片
最后在命令窗口输入 sudo matlab
就可以打开MATLAB
kinect和联想E460自带相机标定_第16张图片


感觉可以不装MATLAB的的,但是装了就装了吧
据说是用拍的照片来进行标定的,那么只要会用摄像头进行拍照片,然后进行导入就可以了
http://www.cnblogs.com/li-yao7758258/p/5929145.html
opencv的方法:
http://blog.csdn.net/t247555529/article/details/47836233
matlab的方法:
http://blog.csdn.net/heroacool/article/details/51023921

采用matlab进行标定,

在命令窗口输入:cameraCalibrator
我测量了一下大概每个格子是24mm
kinect和联想E460自带相机标定_第17张图片
kinect和联想E460自带相机标定_第18张图片

写在最前面,这里我用的matlab相机标定的方式是错的!!!

输出的结果
kinect和联想E460自带相机标定_第19张图片
最后的误差要小于0.5
我这个刚号0.5 导入了24张图片
kinect和联想E460自带相机标定_第20张图片
输入:这是相机的内置参数矩阵

cameraParams.IntrinsicMatrix

输出

ans =

   1.0e+03 *

    1.0223         0         0
         0    1.0248         0
    0.6436    0.3609    0.0010

输入:cameraParams.RadialDistortion这是径向畸变
输出:0.0618 -0.0409
输入:cameraParams.TangentialDistortion这是切向畸变
输出:0 0
然后我们来分析一些这三个矩阵:

help cameraParams.IntrinsicMatrix

这个是3*3的矩阵[fx 0 0; s fy 0; cx cy 1] cx,cy是光学中心的坐标 s 是 斜参数 ,当x和y完全垂直的时候是0
fx = F * sx, fy = F * sy ,其中F是焦距的单位mm,sx,sy是每个像素的点的数量,fx,fy的单位是像素

然后对着位置填写进去就可以 了

%YAML:1.0

#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 1.0223
Camera.fy: 1.0248
Camera.cx: 0.6436
Camera.cy: 0.3609

Camera.k1: 0.0618
Camera.k2: -0.0409
Camera.p1: 0
Camera.p2: 0
Camera.k3: 0

# Camera frames per second 
Camera.fps: 30.0

# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1

#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------

# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000

# ORB Extractor: Scale factor between levels in the scale pyramid   
ORBextractor.scaleFactor: 1.2

# ORB Extractor: Number of levels in the scale pyramid  
ORBextractor.nLevels: 8

# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast           
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7

#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize:2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500

跑通orbslam一些注意事项:
http://blog.csdn.net/corfox_liu/article/details/51121392

这里有launch文件的详细介绍
http://blog.csdn.net/rosjjfdfd/article/details/49781295

在ROS下常用的主要有两种驱动包:usb_cam和uvc_cam

一、RGB摄像头的标定
RGB摄像头的标定想必大家都很熟悉,最常用的就是棋盘法。用待标定的摄像头拍摄多幅不同视角下的棋盘图片,将这些图片扔给OpenCV或Matlab,从而计算出该摄像头的内参以及对应于每一幅图像的外参。这里就写写我在标定过程中的一些感受和经验吧。
1、标定所用的棋盘要尽量大,至少要有A3纸的大小;
2、棋盘平面与摄像头像平面之间的夹角不要太大,控制在45度以下;
3、棋盘的姿势与位置尽可能多样化,但相互平行的棋盘对结果没有贡献;
4、用于标定的图片要多于20张;
5、注意设置好摄像头的分辨率,长宽比最好和深度图的相同,比如1280x960(4:3)。
二、深度摄像头的标定
深度摄像头看起来和RGB摄像头差别很大,实际上有很多相似之处。就Kinect而言,其通过一个红外散斑发射器发射红外光束,光束碰到障碍物后反射回深度摄像头,然后通过返回散斑之间的几何关系计算距离。其实,Kinect的深度摄像头就是一个装了滤波片的普通摄像头,只对红外光成像的摄像头(可以这么认为)。因此要对其标定,只需用红外光源照射物体即可,LED红外光源在淘宝上就20元一个。还有一点必须注意,在拍摄红外照片时,要用黑胶带(或其他东西)将Kinect的红外发射器完全挡住,否则其发出的散斑会在红外照片中产生很多亮点,不利于棋盘角点的检测。
kinect的内参
=== Intrinsic ===
554.952628 0.000000 327.545377
0.000000 555.959694 248.218614
0.000000 0.000000 1.000000
=== Distortion ===
0.025163 -0.118850 -0.006536 -0.001345
和Kinect深度摄像头的内参(这个对所有Kinect应该都是差不多的):
=== Intrinsic ===
597.599759 0.000000 322.978715
0.000000 597.651554 239.635289
0.000000 0.000000 1.000000
=== Distortion ===
-0.094718 0.284224 -0.005630 -0.001429


在这个过程当中发现了kinect 的matlab工具箱 和kinect calibration 的工具箱,可以当腾讯微云上下载,我也会把链接贴出来。
kinect 的matlab工具箱:
http://cn.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab
kinect calibration toolbox:
http://www.ee.oulu.fi/~dherrera/kinect/
http://sourceforge.net/projects/kinectcalib/

这里存一些 kinect matlab的一些教程:
http://jingyan.baidu.com/article/af9f5a2d10724343140a45da.html


使用ROS中openNI中自带的包进行标定

1、安装

sudo apt-get install ros-<rosdistro>-openni-camera
这里的<rosdistro>就是你ros的版本。我的ros是indigo,
所以:sudo apt-get install ros-indigo-openni-camera

如果安装正确就不用看下面的了
不正确的话:

rosdep install camera_calibration
rosmake camera_calibration
rostopic list

找到:

/camera/camera_info
/camera/image_raw

就说明已经正确安装了

2、建议你已经会编译 usb_cam 我在跑orbslam的博客中有写到,请移步去看
并且能够理解usb_cam 的topic 是 、/usb_cam/image_raw

3、然后让下一个节点能够订阅这个话题

rosrun camera_calibration cameracalibrator.py --size 6x7 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam

这里size 就是你棋牌格子的个数,我举个例子
kinect和联想E460自带相机标定_第21张图片
这里分别是7*9 所有在填写的时候应该size 6*8, 因为最外层的不算啊
square 0.024 这个0.024就是一个方格的长度,我测量的是24mm 换算成米的话,就是0.024米
4、移动棋盘
kinect和联想E460自带相机标定_第22张图片
kinect和联想E460自带相机标定_第23张图片
不停的左右上下前后移动棋盘,直到吧这个calibrate这个按钮可以点亮
size 表示的格子的大小
skew 表示侧翻
x,y可能表示长度吧,
scale默认是0就好,不需要关心
点击calibrate这个按钮
然后
kinect和联想E460自带相机标定_第24张图片
然后让0.11尽量靠近0之后按commit,就结束标定了
4、找到生成的yaml文件
进入home,然后按Ctrl + H
显示那些隐藏文件夹
kinect和联想E460自带相机标定_第25张图片
我标定后里面的内容如下:

image_width: 640
image_height: 480
camera_name: head_camera
camera_matrix:
  rows: 3
  cols: 3
  data: [697.8452979278655, 0, 327.4718893339171, 0, 701.5696201683555, 201.8721432857928, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.01449668707747287, 0.09006209175368263, -0.01555938259828613, 0.005255809744315504, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [710.2444458007812, 0, 329.19645419468, 0, 0, 709.036865234375, 196.4578845252618, 0, 0, 0, 1, 0]

参考原文链接:
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration#Running_the_Calibration_Node
http://wiki.ros.org/openni_camera


如果想要标定kinect的话,需要两步,1、先同样标定RGB,2 在标定IR (深度)摄像头
1、启动kinect

roslaunch openni_launch openni.launch

2、启动校正的节点

rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 5x4 --square 0.024

这里不需要更改,因为kinect默认吧图片发布到camera/rgb/image_raw 这个上面
然后是同样的步骤:
kinect和联想E460自带相机标定_第26张图片
kinect和联想E460自带相机标定_第27张图片
kinect和联想E460自带相机标定_第28张图片

image_width: 640
image_height: 480
camera_name: rgb_0000000000000000
camera_matrix:
  rows: 3
  cols: 3
  data: [557.4671878091493, 0, 258.9542470035469, 0, 555.1274082338878, 220.5500740224768, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.1304774189138748, -0.06567783878217331, -0.008306341879221272, -0.05287386438832157, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [559.4676513671875, 0, 231.5585687537023, 0, 0, 597.3848876953125, 217.6638013910015, 0, 0, 0, 1, 0]

3、再来标定深度

rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera/ir --size 6x7 --square 0.024

出现这个图:
kinect和联想E460自带相机标定_第29张图片
这时由于红外光斑的影响是没有办法标定的,那么应该吧红外发射装置遮挡住,就像这样
kinect和联想E460自带相机标定_第30张图片
kinect和联想E460自带相机标定_第31张图片
然后接着去标定,就可以了
kinect和联想E460自带相机标定_第32张图片
kinect和联想E460自带相机标定_第33张图片
kinect和联想E460自带相机标定_第34张图片

image_width: 640
image_height: 480
camera_name: depth_0000000000000000
camera_matrix:
  rows: 3
  cols: 3
  data: [616.85214742582, 0, 275.6434852142577, 0, 602.4600482694285, 231.3793845153243, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.08954922725545461, 0.02125234407542443, -0.00350846157746074, -0.05364988623179562, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [621.77001953125, 0, 249.8842894859263, 0, 0, 644.28271484375, 229.9349429782742, 0, 0, 0, 1, 0]

参考链接:
http://wiki.ros.org/openni_launch/Tutorials/IntrinsicCalibration
到这里标定就结束了

双目的话,标定ros参考文档:
http://wiki.ros.org/camera_calibration/Tutorials/StereoCalibration


ubuntu 14.04 安装matlabR2015b
matlab2015的下载链接:点击这里
安装步骤参考链接:点击这里
需要说明的是,在导入*.lic的时候,博客描述的不是太清楚。应该导入license_standalone.lic。剩下的按照博客。基本没问题。安装matlab2015的原因,因为matlab2015已经集成了ROS,相当方便。

你可能感兴趣的:(【SLAM探索】)