windows下opencv单目标定 自带例子使用

原博主写的还是很清楚的,我就是照这个做的。图中原博主会把操作和运行结果同时贴出,大家对照着看。

过程中需要调出那个黑色的cmd窗口,可以在菜单栏里直接输入cmd启动。

------------------------------------------------------------------------------------------------------------------------------------------------------------以下是转载

最近一个项目要进行相机的标定,作为一个菜鸟,瞎搞一下午才搞定,于是写篇博客记录下~

参考资料:(学习笔记)摄像机模型与标定——一次完成标定  http://www.xuebuyuan.com/1586576.html 


OpenCV sample目录下自带两个与相机标定的cpp文件即:calibration.cpp和calibration_artificial.cpp
calibration.cpp 是通过用户输入可选参数进行摄像机标定的程序。
calibration_artificial.cpp 是程序模拟模拟摄像机标定的过程,即程序创建棋盘然后自主标定。


通常我们有两种方式去标定,一个是实时的从摄像机获取拍摄到的棋盘进行标定,一个是已经获得了一些棋盘的图片来标定。

本文详细介绍第二种,即用已获得的棋盘图片的整个过程。

方法一:编译生成 .exe文件,然后在commond 窗口输入参数执行

方法二:通过添加输入参数的代码,然后执行(可以单步调试)(推荐此方法)


calibration.cpp 和 calibration_artificial.cpp 位置如图所示。此外,棋盘图片也在同一目录下




找到文件后,开始新建工程吧。不过在用以获得的图像来进行标定,应先通过opencv自带的imagelist_creator.cpp 产生一个xml或者yaml格式的图像列表,然后在使用下面的程序。

第一步,新建项目demo,添加刚才那个目录下的imagelist_creator.cpp  编译执行得到可执行文件 demo.exe




第二步,执行demo.exe 产生一个xml或者yaml格式的图像列表

static void help(char** av)
{
  cout << "\nThis creates a yaml or xml list of files from the command line args\n"
      "usage:\n./" << av[0] << " imagelist.yaml *.png\n"
      << "Try using different extensions.(e.g. yaml yml xml xml.gz etc...)\n"
      << "This will serialize this list of images or whatever with opencv's FileStorage framework" << endl;
}

输入命令:demo imagelist.yaml  left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpg left07.jpg left08.jpg left09.jpg left010.jpg left11.jpg left12.jpg left13.jpg left14.jpg right01.jpg right02.jpg right03.jpg right04.jpg right05.jpg right06.jpg right07.jpg right08.jpg right09.jpg right10.jpg right11.jpg right12.jpg right13.jpg right14.jpg  。回车,生成imagelist.yaml



第三步,进行相机的标定

先把14张棋盘图片放到debug目录下,然后移除imagelist_creator.cpp  添加 calibration.cpp ,如图所示



编译执行,得到新的demo.exe ,进入cmd ,输入 demo -w 6 -h 9 imagelist.yaml  回车即可。如图所示,开始对每张图片进行角点检测


最后,得到一个 out_camera_data.yml 文件



内容如下:

%YAML:1.0
calibration_time: "08/21/15 16:54:26"
image_width: 640
image_height: 480
board_width: 6
board_height: 9
square_size: 1.
flags: 0
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 5.3765976500165073e+002, 0., 3.4011155767874686e+002, 0.,
       5.3789341813113867e+002, 2.3694081464807104e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 5
   cols: 1
   dt: d
   data: [ -2.7762353155161251e-001, 5.3976467600878486e-002,
       2.1257384355991209e-003, -3.9487502777272009e-004,
       4.8679847473271927e-002 ]
avg_reprojection_error: 4.4034956116049290e-001


此时,大功告成 =。= 

//-----------------------------------------------------------------------------------我是快乐的分割线----------------------------------------------------------------------------------//

//对于想自己单步调试的亲,补充第二种方法,即通过添加代码调试。

第一步:将图片及imagelist放到 D:\Workspace\demo\demo目录下

第二步: 添加代码

具体过程如图所示:


在该目录下放入imagelist.yaml 和14张图片



添加代码

        argc = 6;
argv[0] = "demo.exe";
argv[1] = "-w";
argv[2] = "6";
argv[3] = "-h";
argv[4] = "9";
argv[5] = "imagelist.yaml";





得到的结果是相同的哈,而且可以调试哈~(方法二补充于2015.8.23)




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV是一个开源的计算机视觉库,它提供了许多图像处理和计算机视觉的功能,包括单目标定单目标定是指通过一张图片中的知名物体来确定相机的内外参数,从而实现三维物体在二维图像中的重构。 在OpenCV中,单目标定的过程可以通过以下几个步骤完成: 1. 收集标定图像:首先,需要准备一组已知的物体或标定板图像。这些图像应该涵盖各种摄像机姿势和角度。 2. 提取角点:对于每个标定图像,需要使用角点检测算法来检测图像中的角点。OpenCV提供了一些自动和手动的角点检测算法。 3. 计算相机参数:确定图像与物体之间的对应关系后,可以使用相机标定函数来计算相机的内参数和外参数。这些参数包括图像的焦距、畸变系数、旋转和平移矩阵等。 4. 评价标定结果:通过计算重投影误差等度量标准来评价标定的质量,以确保相机参数的准确性。 5. 应用标定结果:一旦相机参数已经计算出来,就可以将它们应用于其他图像中,以实现三维物体的重构、目标跟踪等应用。 在进行单目标定的过程中,OpenCV提供了一些函数和工具来简化操作,如cv::calibrateCamera、cv::findChessboardCorners等。此外,还可以使用图像采集装置来采集标定图像,通过与OpenCV的接口进行数据传输和处理。 总而言之,OpenCV中的单目标定算法可以通过收集标定图像、提取角点、计算相机参数、评价标定结果和应用标定结果等步骤来实现。这一过程对于计算机视觉和机器人等领域的应用非常重要,能够为后续的图像处理和分析提供准确的相机参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值