您的位置:首页 > 其它

kinect和联想E460自带相机标定

2017-01-16 12:20 357 查看
我打算用MATLAB进行标定

我在Ubuntu14.04下安装MATLAB

参考博客:

http://www.cnblogs.com/nowornever-L/p/5649078.html

在这个问题当中遇到的问题:



这个地方我是做不出来,后来又找了找资料



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

然后显示挂载点之后,进入安装界面后



























然后在跟着那个博客链接,吧那个文件复制进那个文件夹当中,就可以了



最后在命令窗口输入 sudo matlab

就可以打开MATLAB



感觉可以不装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





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

输出的结果



最后的误差要小于0.5

我这个刚号0.5 导入了24张图片



输入:这是相机的内置参数矩阵

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 就是你棋牌格子的个数,我举个例子



这里分别是7*9 所有在填写的时候应该size 6*8, 因为最外层的不算啊

square 0.024 这个0.024就是一个方格的长度,我测量的是24mm 换算成米的话,就是0.024米

4、移动棋盘





不停的左右上下前后移动棋盘,直到吧这个calibrate这个按钮可以点亮

size 表示的格子的大小

skew 表示侧翻

x,y可能表示长度吧,

scale默认是0就好,不需要关心

点击calibrate这个按钮

然后



然后让0.11尽量靠近0之后按commit,就结束标定了

4、找到生成的yaml文件

进入home,然后按Ctrl + H

显示那些隐藏文件夹



我标定后里面的内容如下:

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 这个上面

然后是同样的步骤:







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


出现这个图:



这时由于红外光斑的影响是没有办法标定的,那么应该吧红外发射装置遮挡住,就像这样





然后接着去标定,就可以了







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,相当方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: