我打算用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
输出的结果
最后的误差要小于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
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,相当方便。