OpenCV库自带了一个可以用于相机标定的功能,不仅可以标定最常见的棋盘格标定板,还可以用于Halcon常用的圆点阵列标定板。
以下对如何使用该自带例程进行相机标定进行一个简要的介绍,也算是对之前工作的一个总结。
1.获取标定图片
首先,要对标定板进行多次不同角度的拍摄,获得一组照片,这组照片的角度尽可能不同,尽可能遍布相机画面的各个角落,以提高标定的精度。我这次获得的照片数量是17幅图,使用了圆点标定板。这17幅图使用了连续的编号,从“image_001.bmp”到“image_017.bmp”。
2.明确例程的工作原理
之后,需要明白,这个例程中的标定程序是如何工作的。
OpenCV给我们的例程是“calibration.cpp”这样一个源文件,它当中包含了进行标定运算的所有内容。
首先需要将这个源文件添加到一个新建的并且做好了OpenCV配置的project当中,可以发现该源文件并不能直接在Visual Studio的界面下直接使用“本地Windows调试器”运行,也没有合适的位置添加图片文件。
根据网上的资料,这个“calibration.cpp”所生成的文件读取标定图片的方式并不是直接读取,而是要通过一个“.xml”等类型的文件作为目录来进行读取。因此必须首先形成一个含有所有标定图片的目录的“.xml”文件。
而OpenCV库也提供了一个这样的源文件“imagelist_creator.cpp”的源文件用来生成图像列表文件。同样,该源文件不能直接添加在project中在VS上通过“本地Windows调试器”运行。(因为运行时会出现“返回值为1”等情况)但这个运行生成的“.exe”文件,在命令行“cmd”(大黑屏DOS)下,确实可以实现生成图像列表的功能。
然后再通过“calibration.cpp”文件生成的“.exe”文件和这个图像列表文件,就可以将标定图片导入标定计算程序总进行标定了。
3.具体操作中的要点
“2.明确例程的工作原理”算是重复了一些其他的文章的内容,或者说做了一些解释,看了并不一定就能做好实际操作。下面总结一下我在实际操作中遇到的一些问题,希望以后有则改之无则加勉。
3.1 命令行界面下的文件路径设置
要想从相对路径进行“.exe”程序的调用,需要在命令行界面下首先输入“cd F:\xxxxx”等路径,回车,再输入“F:”才能将命令行转至该“.exe”程序所在的目录下,才能保证可以使用相对目录进行程序调用,以及,生成的文件存储。
由于我已开始并不懂如何使用命令行界面,导致在C盘的用户文件夹生成了很多".xml"文件却没有在“Debug”文件夹中生成“.xml”文件,以致怀疑程序是否存在问题。实际上,是没有用对命令行界面所默认的路径。因此在使用绝对路径生成“.xml”时才在“Debug”中生成了“.xml”文件。此处是容易导致犯错的地方,要小心!
3.2 执行"imagelist_creator"的“.exe”程序
在命令行界面下,输入“xxx.exe image_list.xml image_001.bmp image_002.bmp ......image_017.bmp"再按下回车就可以在指定的路径下生成“image_list.xml”文件,也就是图像列表文件,可以被后面的“calibration”调用。
3.3 生成“calibration.cpp”的“.exe”程序
同样,这个程序在“本地Windows调试器”中运行,也会出现“返回值为-1”的问题,因为某些main函数的参数初值并未给出,也需要放进命令行界面进行运行。
3.4 执行“calibration.cpp”的“.exe”程序
改程序在命令行界面下执行时,需要为main函数输入一些初始参数。
具体的使用方法可以参照如下案例:
原文链接: https://blog.csdn.net/m0_37867795/article/details/80342953
使用cmd命令运行**.exe 参数格式为:** -w=8 -h=8 -pt=circles -o=camera.yml -op -oe -su image_list.xml,
标定的结果就在camera.yml中。
具体内容解析:
-w表示横向特征点的个数 -h表示纵向特征点的个数 -pt表示类型,可以是棋盘或者圆点 -o表示输出 其他几个可以参考“calibration.cpp”中的注释内容。 最后的 image_list.xml表示输入标定图像的目录,也就是上一个步骤由“imagelist_creator”得到的标定图像文件目录。
3.5 最终标定效果
运行上述程序后可以发现,窗口右下角会有一个分数出现,每当程序成功识别出一个圆形阵列,分子就加一,而分母是图片总数。最后只识别到了一部分图片,进行了标定计算。之后通过按键可以观看标定后的图片,并且在命令行界面可以看到显示“标定成功”以及反投影的误差在0.17左右。由于全部17个标定图片并没有被全部识别出来,因此还存在一定的标定盲区。
可以推测,这个识别率与标定图片本身的质量也有关系,有必要对图片进行一些预处理(比如滤波消除一些噪声)再进行标定。
以上还只是对该标定程序的初步使用心得。后期还会对标定准确率以及如何使用标定参数等内容进行进一步更新。
同时,对于生成“imagelist”的方法,也见到有一些生成较多数量文件的list的方法,后期也将追加相关的笔记。