利用MATLAB calibration工具求图像的内外参并进行正视图校正

版权声明:本文为博主原创文章,若转载请附上原地址~ https://blog.csdn.net/sinat_27088253/article/details/80103081

研究生第一年转眼已经快结束了,做的最多的事情就是在标定相机的内外参,现在基本算做完了,写篇博客总结一下。

项目简介
在做的是一个国家自然科学基金的一个项目的一部分,具体装置如图所示
材质测量装置
其中内层半圆是六个相机,外层是20个光源,中间是一个可以放置各种材质的30厘米*30厘米的转台,相机臂不可转动,光源臂和转台都可360度转动。我需要求的是每个相机的内参以及每个相机对应的各个转台角度的外参(由于设置的是每次转动30度,所以一共有12个转台角度)。

MATLAB calibration标定工具的使用

1.把所要标定的图片复制到当前文件夹中
复制到当前文件夹
2.在命令行窗口输入 calib,启动标定工具,并点击standard(一般现在的电脑配置都可以满足标准模式标定)
标定工具启动界面
3.点击Read images,就会把当前文件夹里的图片全部读取到MATLAB工作区,并且存储成变量模式,I_1到I_20就是存储的图像信息。但是图片读进来会变成灰度的,没有存储图片的rgb信息。
这里写图片描述
如果图片名称只包含数字,则可以直接回车,若包含字母,如t20.jpg,就需要输入t.
下图为读入到工作区的图片信息。
这里写图片描述
4.点击extract grid corners,就会开始标定工作
这里写图片描述
这里写图片描述
这里写图片描述
注意X,Y轴的初始定义方向
5.把所有图片都标定完之后,点击Calibration,就会给出标定结果
注意:如果你最终需要的是同一个相机的内参和其对应的多个转台角度图片的外参,最好先标定一定数量的图片(15-20张)作为标定基础,后面再一次累加需要标定外参的图片
这里写图片描述
内部参数列表:

焦距:以像素为单位的焦距存储在2x1矢量 fc中。
主点:主点坐标存储在2x1矢量 cc中。
倾斜系数:定义x和y像素轴之间角度的倾斜系数存储在标量 alpha_c中。
失真:图像失真系数(径向和切向失真)存储在5x1向量 kc中。
内参矩阵
这里写图片描述
6. 点击recomp.corner,选择和刚开始标定时选择的相同的wintx,winty。再点击calibration重新标定,得到更精确的标定值。
7. 若你只需要得到相机的内参,这个时候任务已经完成了。若需要求特定图片的内参则需要接着把需要标定的图片复制到当前文件夹,再点击read images和extract grid Corner重新标定当前新加入的照片,点击完角点之后再点击calibration,这时不要再点击recomp.corner,再点击的话就会扰乱之前的基础标定数据,导致每次求出来的相机内参差别很大
8. 求完内参之后就可以求开始外参,为了保证较高的准确度,外参需要一个一个的求(但是如果角度比较正,也可以一次性多求几张),也就是每次需要把之前read进来的image,通过add/suppress images来删除,只add当前需要求的图片。
这里写图片描述
9. 点击comp.Extrinsic,和之前求内参时一样点击角点,但是需要注意的是每次点击角点的顺序需要一样,也就是需要保证每次建立的外参坐标系一致,第一个点击的角点将被作为坐标系原点
这里写图片描述
10. 根据求出来的外参建立外参矩阵out=[Rc_ext Tc_ext]
这里写图片描述
11.
正视图校正
主要思想
张正友标定法,运用图形坐标系和世界坐标系的映射关系来做。具体请参照张正友标定法论文或相关资料。

以下为封装的一个MATLAB函数,传入的参数分别是内参,外参,循环的最小值,循环的最大值,需要校正的图像,返回的是校正后的图像信息。

function cal=MyCalibration(In ,Out, min, max, pic)
H = In * Out;
for X = min:max
     for Y = min:max
       u = H*[X, Y, 0, 1]';  %通过乘系数来改变图像分辨率,展示细节
       U(X-min+1,Y-min+1) = round(u(1)/u(3)); V(X-min+1,Y-min+1) = round(u(2)/u(3)); 
     end
end
U =uint16(U);
V = uint16(V);
for X =1:max-min+1 %修改X,Y起始值,改变最终显示的图像范围
     for Y = 1:max-min+1
       if(0<U(X,Y) &&U(X,Y)<=2736 && 0<V(X,Y) && V(X,Y)<=2192)
          cal(X,Y,:) = pic(V(X,Y),U(X,Y),:); %U,V坐标和X,Y的对应关系需要调换一下,V对应X,U对应Y
       end
     end
end

调用实例

pic = MyCalibration(in,out,-255,255,I_1);
imshow(uint8(pic));

最终的标定结果(上图为原图,下图为标定后的图片)
这里写图片描述

参考资料:
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html
http://www.vision.caltech.edu/bouguetj/calib_doc/
https://blog.csdn.net/jameshater/article/details/53172333
https://wenku.baidu.com/view/748bc5250508763230121222.html

猜你喜欢

转载自blog.csdn.net/sinat_27088253/article/details/80103081