结构光单目逆相机法-相机投影仪系统标定(1)

目录

前言:

单目逆相机法概念:

相机标定:

投影仪标定:

立体标定


前言:

笔者是实验室第一个做单目结构光三维重建方向的,刚开始学习结构光的时候非常迷茫,导师不是这个方向,无法提供指导。文献都是晦涩难懂的专业术语,无人指路,网上资料也很少,都是靠自己看文献摸索出来的。

目前开发了一套单目结构光蓝光三维扫描系统,视场25cm*20cm,工作距离60cm,精度0.05mm。准备读博,继续做3D视觉+AI方向。

开这个专栏的目的,就是想帮助像我之前一样无人指点,处在迷茫中的同学,我非常能理解那种心情,笔者将会提供一些力所能及的帮助。

目前准备先写一篇,如果看的人多的话,会考虑继续更新。大家有什么不懂的地方,也可以在评论区留言,我尽力给大家解答。

单目逆相机法概念:

        所谓逆相机法,就是将投影仪当成相机来使用,笔者刚开始学习的时候,总是难以理解这个概念,其实在学通了以后,还是很好理解的,其中主要理解的关键点就是"投影仪投出来的图案,就是它所看到的图像"。

        这句话是不是非常抽象?不要慌,我刚开始学的时候也觉得非常抽象,无法理解。现在我们用单目三维重建公式来讲述这个原理:

注:图片引用自论文《
Calibration of fringe projection profilometry: A comparative review

这两张图片是不是很熟悉?引用自左超老师课题组的结构光标定模型综述,下面这张图就是传统三角测量法的重建公式。图中Pc,Pp分别是相机和投影仪标定的单应性矩阵(内参矩阵+[R,T]),所以在进行三维重建之前,我们需要对相机和投影仪组成的单目结构光系统进行标定。

系统标定方法:

1.相高法(需要高精度移动平台,笔者实验室开山方向,没这条件)

2.局部单应性矩阵法(精度稍低)

3.八参数法(未考虑投影仪畸变,未用过)

4.三角测量法(笔者所用方法,简单好用,建议新手)

第二种方法和第四种方法都是自己按印象取名,可能不够准确,后面查证了再改。这里主要介绍第四种,也就是笔者所用的方法来标定单目结构光系统,这一步包括了
相机标定,投影仪标定,以及系统的立体标定。

相机标定:

        这个简单,网上资料也非常多,这里就不介绍了。

投影仪标定:

        既然是把投影仪当作相机用,按照相机标定的方式进行标定,那么我们就需要获取标定过程中的两个要素:1.识别到的圆心坐标点.  2.圆心坐标点对应的世界坐标点。

        世界坐标系是自己定义的,这个就非常好解决。那么投影仪如何识别到标定板圆心坐标点呢?这就回到前文"投影仪投出来的图案,就是它所看到的图像"。投影仪本身是投影编码图案出去,无法主动采集图像。这时候就需要借助相机来使投影仪“看到”圆心坐标点。

        这个时候就需要结构光系统的核心算法——结构光编码技术了,由计算机生成编码图案,投影仪投影编码图案到标定板上,然后相机拍摄标定板图像并解码,根据解码的结果计算出投影仪视场中标定板圆心的位置,这样投影仪就借助相机看到了标定板圆心,便可以进行标定重建的原理也是如此,只是把圆心坐标,换成物体上的像素坐标而已。

        这篇文章不细讲结构光编码,只需要知道投影仪看到标定板圆心,是因为投影仪投影了编码图案到标定板上,相机拍摄后解码,计算出了标定板圆心在投影仪图像中的位置。具体的编码解码算法有很多,相移法+多频外差,相移法+互补格雷码都有很多应用,CSDN上面也有开源的代码,但是我发现很多就是讲解码的方法,但是针对这个东西为什么要这样用或者为什么要这样编码,没有一个系统性的解释,如果大家感兴趣,我会出一篇关于结构光编码的文章,详细推导一下它的设计思路。       

立体标定:

       还需要注意一个细节就是,相机和投影仪分别标定结束后,还需要进行一个立体标定,因为在标定的过程中,标定板假设摆放了十几个位姿,世界坐标系原点在标定板上,也就是说相机到标定板有十几个RT(旋转平移矩阵),重建的时候采用哪一组RT精度比较高呢?(投影仪同理)

        这一步就参考了双目立体视觉的立体标定算法,将十几组RT外参优化,最终只生成一组外参,此时世界坐标系原点在双目视觉系统中左边相机的光心处,RT应该是右边相机(投影仪)到左边相机的旋转平移矩阵,在Opencv中调用的形式如下:

	err = cv::stereoCalibrate(m_WorldCorner_1, m_Point, m_Proj->m_ProjPoint, this->cameraMatrix,
		this->distCoeffs, m_Proj->proj_Matrix, m_Proj->distCoeffs, pic_Size,R,T,E,F,ERR,cv::CALIB_FIX_INTRINSIC);

       将之前相机、投影仪分开标定的参数传进来,不再赘述。

请注意最后一个参数,cv::CALIB_FIX_INTRINSIC,这个参数决定了怎么样去优化这个系统的内外参,因为我们是将投影仪当作相机使用,但并不是真正的相机,并且分辨率与工业相机也差很多,所以这里要选择固定内参,否则这个函数会将投影仪和相机 当作双目系统(左右相机内参一致)去同时优化改变它们的内外参,我们这里选择固定内参,只优化外参最终优化十几组RT,只生成一组精度最高的RT,至此系统标定结束。

总的来说单目结构光标定流程如下:

1.标定板摆放位姿1,相机采集图像

2.相机采集完图像后,投影仪投影编码图案,相机同步采集。

3.对采集的图像解码,步骤1相机采集的图像,识别到圆心像素坐标,再取解码后圆心像素坐标对应的编码值,通过公式计算映射到投影仪视场中,就找到了位姿1标定板圆心在投影仪视场中的像素坐标。这样就可以对投影仪进行标定了。

4.标定板摆放位姿2,重复以上3个步骤....

5.大概采集15组左右,即可对相机和投影仪分开标定。

6.相机投影仪分开标定结束,再对系统进行立体标定。

总体流程就是这样,接下来贴出我标定时采集的图像,共11组图。
相机标定:

标定板摆放了11个位姿,也就是采集了11组数据。

相机拍摄的标定板图像

识别到的圆心坐标点

位姿1下投影仪投影的编码图案

11个标定板位姿下投影仪看到的圆心坐标

图像采集完毕后,分别对相机和投影仪进行标定,标定结果如下:

相机投影仪标定结果

笔者创建了一个光学测量/双目/单目结构光三维重建的技术交流群,如果感兴趣的话可以加群,有什么问题想法可以在群里提问交流,群号:914994546。