kinect和联想E460自带相机标定

来源:互联网 发布:mac怎么快速回到桌面 编辑:程序博客网 时间:2024/04/29 00:08

我打算用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.0223Camera.fy: 1.0248Camera.cx: 0.6436Camera.cy: 0.3609Camera.k1: 0.0618Camera.k2: -0.0409Camera.p1: 0Camera.p2: 0Camera.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 imageORBextractor.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: 20ORBextractor.minThFAST: 7#--------------------------------------------------------------------------------------------# Viewer Parameters#--------------------------------------------------------------------------------------------Viewer.KeyFrameSize: 0.05Viewer.KeyFrameLineWidth: 1Viewer.GraphLineWidth: 0.9Viewer.PointSize:2Viewer.CameraSize: 0.08Viewer.CameraLineWidth: 3Viewer.ViewpointX: 0Viewer.ViewpointY: -0.7Viewer.ViewpointZ: -1.8Viewer.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_calibrationrosmake camera_calibrationrostopic 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: 640image_height: 480camera_name: head_cameracamera_matrix:  rows: 3  cols: 3  data: [697.8452979278655, 0, 327.4718893339171, 0, 701.5696201683555, 201.8721432857928, 0, 0, 1]distortion_model: plumb_bobdistortion_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: 640image_height: 480camera_name: rgb_0000000000000000camera_matrix:  rows: 3  cols: 3  data: [557.4671878091493, 0, 258.9542470035469, 0, 555.1274082338878, 220.5500740224768, 0, 0, 1]distortion_model: plumb_bobdistortion_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: 640image_height: 480camera_name: depth_0000000000000000camera_matrix:  rows: 3  cols: 3  data: [616.85214742582, 0, 275.6434852142577, 0, 602.4600482694285, 231.3793845153243, 0, 0, 1]distortion_model: plumb_bobdistortion_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

1 0
原创粉丝点击