使用openCV标定摄像机的各种参数

平台:windows10+vs2013

版本:openCV3.1.0

参考的博客:

http://wiki.opencv.org.cn/index.php/%E6%91%84%E5%83%8F%E5%A4%B4%E6%A0%87%E5%AE%9A

http://blog.csdn.net/app_12062011/article/details/52021458

 

对摄像机进行标定可以使用直接使用摄像头也可以事先拍好照片,本文采用的是事先拍好照片,这里的照片采用的是openCV2.4.10版本自带的图片。图片的位置是opencv\sources\samples\cpp中的,见下图所示:

使用openCV标定摄像机的各种参数_第1张图片

 

第一步:由上面的图片得到需要使用的图片集合文本imagelist.xml

所需材料:生成imagelist.xml文本的代码imagelist_creator.cpp(代码位于opencv\sources\samples\cpp中,可以在vs2013中生成相应的imagelist_creator.exe程序)

方法过程:首先可以在vs2013中生成相应的imagelist_creator.exe程序,然后通过windows的命令行cmd执行imagelist_creator.exe应用程序,具体的步骤是:打开cmd,输入imagelist_creator.exe的目录到其目录下,输入下面的命令:imagelist_creator.exe left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpgleft07.jpg left08.jpg left09.jpg left010.jpg left11.jpg left12.jpg left13.jpgleft14.jpg right01.jpg right02.jpg right03.jpg right04.jpg right05.jpgright06.jpg right07.jpg right08.jpg right09.jpg right10.jpg right11.jpgright12.jpg right13.jpg right14.jpgimagelist.xml,最后就会生成一imagelist.xml文本。

使用openCV标定摄像机的各种参数_第2张图片 


使用openCV标定摄像机的各种参数_第3张图片


第二步:由上面生成的图片集合解算出需要的参数

所需材料:(1)所有的图片(2)计算参数的代码calibration.cpp (代码位于opencv\sources\samples\cpp中,可以在vs中生成相应的calibration.exe程序)

方法过程:对于calibration.exe的调试分为两种方法(1)通过cmd。(2)使用vs2013调试。

对于第一种方法,出现错误无法得到问题所在以及解决方法,而第二种方法很方便的得到问题的根源,方便的解决,所以这里重点讲解第二种方法。

1.      使用第二种方法,需要在源代码中添加手动参数项,在主函数最前面添加如下的代码,这里的w和h分别指代宽和高方向上角点的个数

argc = 4;

argv[0] = "calibration.exe";

argv[1] = "-w=8";    

argv[2] = "-h=6";     

         argv[3] = "imagelist.xml";

添加代码的依据是根据代码中的解释项:

 使用openCV标定摄像机的各种参数_第4张图片

 

最后编译运行就会的到最终的结果:out_camera_data.yml

使用openCV标定摄像机的各种参数_第5张图片


使用openCV标定摄像机的各种参数_第6张图片


2.      使用第一种方法就是直接在cmd中输入下面的命令行:

calibration.exe –w=8 –h=6 imagelist.xml

最后的到与方法二相同的结果。


3.摄像头由于光学透镜的特性使得成像存在着径向畸变,可由三个参数k1,k2,k3确定;由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数p1,p2确定。单个摄像头的定标主要是计算出摄像头的内参(焦距f和成像原点cx,cy、五个畸变参数(一般只需要计算出k1,k2,p1,p2,对于鱼眼镜头等径向畸变特别大的才需要计算k3))最后得到的两个矩阵中的值就对用这几个内参。其中camera_matrix矩阵中对应着焦距f和成像原点cx、cy,distortion_coefficient矩阵对应着畸变参数k1,k2,k3,p1,p2.

 

总结注意:

1.       图片采用openCV提供的就可以完成上面的代码验证以及得到结果,换成自己拍摄的照片就得不到结果,程序卡死在需找角点的代码中。

2.       无论是进行方法一还是方法二,图片和imagelist.xml文本都必须放在相应的执行代码同目录下,不然无法读取到文件和图片。

3.       在使用vs2013调试openCV程序的时候出现异常的错误:0x00007FFCC21B512D (msvcp120d.dll) (OpenCVText.exe 中)处有未经处理的异常,读取位置 0x46851284 时发生访问冲突,解决的办法是检查一下自己的VS配置,debug,release相应的要增加*d.lib,*.DLL。问题就解决了。

你可能感兴趣的:(openCV)