使用Matlab工具箱(procamcalib)进行投影仪标定—超详细过程
一 、procamcalib工具箱应用场景
同于相机标定的方法和步骤,投影仪的原理通常被看作是相机成像的逆过程,网上关于相机标定和校准的教程有很多,但投影仪标定的资料一方面另一方面介绍不够详细,对新手不太友好,所以这次分享的主要目的是做成全网目前最详尽的投影仪标定工具箱使用方法说明。
procamcalib工具箱是在matlab相机标定工具箱Bouguet’s Calibration Toolbox基础上进行二次开发,从而实现对投影仪的标定,所以在具体操作过程中也会和Bouguet’s Calibration Toolbox有重合的步骤,最终都是为了得到内参外参和畸变参数这些信息。
很大一部分使用者的需求是为了用在结构光三维重建领域中,其中很多人更喜欢用光栅相移条纹进行投影仪的标定,我们使用的工具箱不是这种方法,而是投影棋盘格和打印的棋盘格一起联合标定;当然还有另一部分的使用者只是用来矫正投影镜头的畸变,总之我想让大家学会怎么快速使用这个工具箱达到自己的目的而不是重点讲解理论,投影仪标定的理论有很多,有一部分属于先对相机进行标定然后再进行投仪标定,本文就属于这种,有的方法不需要先进行相机标定,具体理论区别我们就不展开说了,有需求的小伙伴就要自行去啃论文了。
这里贴出procamcalib工具箱的论文出处:
Plane-based calibration of a projector-camera system. GabrielFalcao, Natalia Hurtos, Joan Massich. VIBOT Master 2008.
二 、准备工作
事先下载两个工具箱
投影仪标定工具箱
Bouguet’s Calibration Toolbox
三 、标定详细步骤
1.把刚才两个工具箱的路径加载到里面,这样系统才能识别到
2.把搜索目录设置成待标定图片所在文件夹,注意图片的命名必须有相同的格式,比如r_1.jpg,r_2.jpg…这样才能被索引到
3.在命令窗口输入:
cam_proj_gui
打开投影仪标定工具箱GUI界面
4.相机标定步骤
GUI界面点击Camera Calibration GUI选项,选择图片
此时命令窗口显示:
Basename camera calibration images (without number nor suffix):
此处输如你的待标定图片的命名格式: r_ (和你的命名有关) 然后回车
此时命令窗口显示:
Image format: ([]=‘r’=‘ras’, ‘b’=‘bmp’, ‘n’=‘png’, ‘t’=‘tif’, ‘p’=‘pgm’, ‘j’=‘jpg’, ‘m’=‘ppm’)
此处输如你的待标定图片的格式: j(表示JPG) 然后回车
此时会出现所有需要标定的图片
然后GUI界面点击提取角点
此时命令窗口出现提示:
Extraction of the grid corners on the images
Number(s) of image(s) to process ([] = all images) =
Window size for corner finder (wintx and winty):
wintx ([] = 45) =
winty ([] = 45) =
Window size = 91x91
Do you want to use the automatic square counting mechanism (0=[]=default)
or do you always want to enter the number of squares manually (1,other)?
全部回车默认选择
在弹出窗口选择打印棋盘格的四个角点,然后在命令窗口会出现提示输入棋盘格的实际尺寸。
我的实际尺寸是10mm
Size dX of each square along the X direction ([]=100mm) = 10
Size dY of each square along the Y direction ([]=100mm) = 10
此处回车默认选择没有初始化参数
If the guessed grid corners (red crosses on the image) are not close to the actual corners,
it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)
Need of an initial guess for distortion? ([]=no, other=yes)
提取角点完成后出现下图,然后依次按照上述步骤重复完成操作
当最后一幅角点提取完成后显示下图
点击标定的选项,在命令窗口输出相机标定结果。
GUI界面点击保存后然后退出,此时相机标定结束
5.投影仪标定步骤
加载刚才的相机标定结果,命令窗口显示:
Loading calibration results from Calib_Results.mat
done
使用之前标定相机的相同照片去做投影仪的标定
命令行窗口显示:
Do you want use the same images used for camera calibration to calibrate the projector? ([]=yes, other=no)
回车默认选择(如果你单独对相机做了标定,此处应重新选择图片)
GUI界面继续选择下一项
命令窗口显示:
You may now run ‘Calibration’ to recalibrate based on this new set of images.
Window size for corner finder (wintx and winty):
wintx ([] = 5) = 20
winty ([] = 5) = 20
Window size = 41x41
此处先回车默认选择前面所有图片,wintx and winty值可以适当改大点,不然可能那捕捉不到角点位置
然后手动选择四个角点,如果识别到的话会自动提取所有角点(注意如果系统不能自动提取角点提醒需要你手动输入X和Y方向方格数量的话一般是你的前面输入的wintx and winty值不太合适;当然也有可能是你图片不够清晰)
依次重复上面的操作直到所有图片完成
注意完成后命令窗口会提示:
Projected image name:
此时要输入投影仪投影的模板图片名称,这张图片也应该放在相同文件夹中才能索引到,我的名称是 pattern.png 然后回车
命令窗口再次出现提示:
Window size for corner finder (wintx and winty):
wintx ([] = 5) =
winty ([] = 5) =
Window size = 11x11
回车选择四个角点,轻车熟路了已经
接下来要注意命令窗口出现:
Size dX of each square along the X direction ([]=30mm) =
Size dY of each square along the Y direction ([]=30mm) =
按理说投影出来的棋盘格没有固定尺寸的,因为每次都要更换不同的位置拍照 ,这里让输入棋盘格XY方向的实际尺寸岂不是很扯淡?
我找到了作者的官方回复,翻译过来意思就是说当时是在Bouguet’s Calibration Toolbox基础上进行二次开发的嘛,相机标定的时候确实需要输入实际尺寸的,他为了省事就没改。。。所以这里写不写尺寸都没影响的。。。我他么日了狗了,这个问题困扰了我一个星期好嘛
然后这里继续默认回车
If the guessed grid corners (red crosses on the image) are not close to the actual corners,
it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)
Need of an initial guess for distortion? ([]=no, other=yes)
回到GUI点击此处
激动人心的时候到了,命令窗口出现投影仪标定参数
补充:
标定之后投影仪相对相机的外参矩阵在右侧工作区找:
全剧终!!!
为了更详细的介绍,我在B站录了一个视屏视屏教程