【光电智造】关于相机标定的问题答复网友 世界热文
今日光电
网友snow2012720
我刚开始学习计算机视觉的双目三维重建内容,感觉好多内容不懂,看到你的博文,了解到你对双目标定三维重建这些有深入的研究,您是过来人了,能否帮忙给我在学习标定匹配三维重建过程中给予指点?包括看什么资料,用什么算法程序等等,非常感谢!
(资料图片)
答复:
其实双目三维重建这一块我也没有深入的原理研究,只是有一些相关经验吧。有一些资料对于这方面是很重要的,包括:
1、相机标定的理论与工具
相机标定是计算机视觉最基础也是至关重要的一个问题,标定的精度够不够决定了以后的校正、去畸变、配准、计算三维坐标、恢复三维模型能否进一步做下去。这方面推荐你看张正友关于相机标定的paper(谷歌一下吧),这是这方面最重要的一个理论基础,目前我们使用的matlab标定工具箱 和 opencv标定api都是以这篇论文的方法为基础的。
2、熟悉matlab calibration tollbox、 matlab computer vision toolbox 和 opencv
这是做这一块最重要的几个工具。opencv 的sample中有一个源程序 你可以到opencv的安装路径下去找stereo_match .cpp stereo_calib.cpp这两个程序是opencv给的双目匹配、相机标定的例子,跑一遍就知道整个过程了。matlab computer vision toolbox是2010版本才有的貌似,反正2008没有
3、网上的相关资料
北航的一个博士的opencv学习笔记,对于初学者非常有帮助
http://blog.csdn.net/chenyusiyuan/article/details/5072597
opencv中文论坛
opencv的书籍:《学习opencv》很经典的一本书
opencv 帮助文档 http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html
有条件的话找一篇硕士或者博士论文看看,会让你对整个领域有一个全貌的了解
我所知道的也只有这些了,祝学习顺利!
QQ 网友龙卷风问:
我现在在做标定时 得到的相机焦距在x y方向所占的象素不一样 (一个994 一个999)但我的象元是方形的 5.2*5.2 这是为什么啊?
另外 我已知特征点的象素坐标 想得到他的摄像机系下的坐标 其中z值 我直接用的焦距 这样对吗?
答复:
焦距在x y方向所占的象素不相等,表明一个像素的x、y两个方向的尺寸不完全相等,可能的原因:(1)由于工艺条件限制,做不到象元的长宽完全的相等 (2)标定的过程本身有误差 不知道你采集图片是否足够多,一般20张以上为佳
你给我看的结果 焦距在x y方向所占的象素似乎差别不算大 还是可以的
已知特征点的象素坐标 想得到他的摄像机系下的坐标 如果你说的特征点 指的是标定板的方格顶点, 这应该根据相机的外参数可以得到,也就是拍这张照片时标定板坐标系和相机坐标系之间的变换关系(旋转矩阵、平移向量描述)。直接用的焦距是怎么做的,我不太明白,能否说一下你的思路,如果直接用焦距作为Z值,肯定是没有意义的了 呵呵
网友tingingjiayou:
我想问一下,如果使用标定工具箱进行标定,扭曲系数表示的是什么意思?怎么样看出主点的偏移量,谢谢您了!帮我解决下
答复:
在http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html 中,对扭去系数Skew coefficient的定义是:
The skew coefficient defining the angle between the x and y pixel axes is stored in the scalar alpha_c.
翻译一下,扭曲系数就是一个像素的x,y两个方向的夹角的表示,以标量alpha_c表示。
该页面还有一段话:
Observe that fc(1) and fc(2) are the focal distance (a unique value in mm) expressed in units of horizontal and vertical pixels. Both components of the vector fc are usually very similar. The ratio fc(2)/fc(1), often called "aspect ratio", is different from 1 if the pixel in the CCD array are not square. Therefore, the camera model naturally handles non-square pixels. In addition, the coefficient alpha_c encodes the angle between the x and y sensor axes. Consequently, pixels are even allowed to be non-rectangular. Some authors refer to that type of model as "affine distortion" model.
翻译一下,大意是说, fc(2)/fc(1)可以不等于1,表明一个像素的x、y两个方向的尺寸可以不相等,并且,一个像素的x、y两个方向可以不垂直,以至于一个像素不一定要是长方形!扭曲系数就是度量这种远离矩形的程度的。
关于主点的偏移量,关键是要理解 主点位置cc 和 主点偏移量 的概念。
主点偏移量就是主点位置距离照片的中心的物理距离(以mm为单位,不是像素为单位)
http://blog.sina.com.cn/s/blog_77805ef60100s9a6.html 这里有答案,转述如下
该如何计算像主点偏移量?
像主点偏移量的计算:我们相机检校获得的是像主点位置坐标。
相机检校参数:
主点x0:2785.2544主点y0:1895.4608(单位:像素)
像幅5616*3744像素,像素大小:6.41um
该如何计算像主点偏移量?
x偏移量=(x0-5616/2)*6.41um
y偏移量=(y0-3744/2)*6.41um
然后在分别除以1000,换算为mm。
网友cy610374797 2012-06-02 19:43 表示:“我只想要一个代码,输入像素点的坐标,输出该点对应的摄像机坐标,求助”
答复如下:
你想要的这个效果,就是双目视觉领域的研究想要达到的最终效果:通过两个相机的照片或者视频信息,得到照片中特征点的三维坐标信息,即通过双目(两个摄像头)达到“视觉”(获得物体的三维坐标信息)。很遗憾的告诉你,我对这方面的积累还远远不足以给你一个直接就能用的代码。我只能就我的理解,写一写我对实现这个效果的步骤的认识,未必全正确,请仔细推敲。
要达到这个目的,要分两步,第一步,是摄像机标定,通过标定,得到左右相机的内参外参,以及右边相机相对于左边相机的位置和角度关系(涉及旋转和平移)。这也就是我的这四篇文章一直在讲的事。
双目标定的原理及MATLAB标定工具箱的使用
MATLAB标定工具箱的使用(一)、(二)、(三)
第二步,就是利用这些标定好的信息,通过照片上的像素位置来计算世界三维坐标了,这就是计算机视觉中三维重建所研究的问题。
我这里提供了一个三维重建的计算函数,使用matlab写的,通过两幅图像中的匹配点重建该匹配点在世界坐标系的坐标
注意,这里提到的两幅图中的射影矩阵实际上就是MATLAB标定工具箱的使用(一)所述的投影矩阵,即内参矩阵和外参矩阵的乘积,而且这里的重建需要知道特征点在两副照片中像素位置的对应关系。这种对应关系可以借用对极线来刻画,建议去了解一些对极线的内容,这方面我也不是很懂。
function X= Reconstruction(Pt1,Pt2,P1,P2)
%通过两幅图像中的匹配点重建该匹配点在世界坐标系的坐标
%输入说明
% Pt1 第一幅图像中匹配点的像素坐标(2列)
% Pt2 第二幅图像中匹配点的像素坐标(2列)
% P1 第一幅图像的射影矩阵(3*4)
% P2 第二幅图像的射影矩阵
Np=size(Pt1,1);
X=zeros(Np,4);
for i=1:Np
A=zeros(4,4);
A(1,:)=P1(1,:)-Pt1(i,1)*P1(3,:);
A(2,:)=P1(2,:)-Pt1(i,2)*P1(3,:);
A(3,:)=P2(1,:)-Pt2(i,1)*P2(3,:);
A(4,:)=P2(2,:)-Pt2(i,2)*P2(3,:);
T= MinEigVector ( A"*A );%求最小特征值对应的特征向量
X(i,:)=(T/T(4))";
end
csdn 网友chenyianhfut 问我:
大侠,你好,想问下,标定工具箱标定出来的fc是什么啊,我通过不同的镜头拍摄的图像进行标定,fc都不一样,能通过这些值求出有效焦距(mm)吗,谢谢
为了和其他网友分享,我将答复发表如下:
fc的意思是用照片的像素尺寸折算出来的相机焦距,可以参考:
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html
这里的解释是Focal length: The focal length in pixels is stored in the 2x1 vector fc.
既然是焦距,不同的镜头焦距不一样就很正常了。你的有效焦距的问题是这样的,记有效焦距为f(mm),则fc=[f/dx , f/dy] 这里的dx dy分别表示照片上一个像素点在水平和垂直方向对应于成像平面的物理距离(mm为单位),注意fc包含两个方向的值。求有效焦距(mm)需要知道dx dy。建议你参考http://wenku.baidu.com/view/51cbe7da6f1aff00bed51edf.html
网友limeng198616 问:
您好,见您写了好几篇关于摄像机标定的博文,您对摄像机标定因该比较精通。我这段时间正在用matlab标定工具箱,但我发现标定出来的主点坐标误差非常大,我在实际中根本就没法子用。这是怎么个一回事啊?例如同一个摄像机第一次标定出来的结果是300*282,第二次标定就成了367*277,期间相机完全没动过,就是两次标定用的图像不一样。
答复如下:
你说的这个问题我没有细究过,不过有两点有必要确认一下:一、对相机的一次标定要多用几张图才会比较准确,如果你的两次标定是每次用一张图,那不准是很正常的;二、如果你的相机是自动变焦的,也可能会造成主点的计算差别大;三、如果不是前两种原因,建议你做采集几组照片标定试试看。matlab的相机标定工具箱calibration toolbox的标定是先预估然后做迭代优化,预估时,主点的值一定是照片的尺寸的一半,如照片是1024*768 那么主点初值是512*384 经过优化以后会有小范围调整,不会偏差太远。
----与智者为伍为创新赋能----
联系邮箱:uestcwxd@126.com
QQ:493826566