opencv 单目相机标定 自带例子程序的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/t247555529/article/details/47836233
                                        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
                    <div class="htmledit_views">

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

参考资料:(学习笔记)摄像机模型与标定——一次完成标定  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)




        </div>
            </div>
### 回答1: QT是一个开源的跨平台应用程序开发框架,OpenCV是一套用于计算机视觉和机器学习的开源库,而单目相机标定是指通过对单个相机的内外参数进行估计的过程。 在使用QT和OpenCV实现单目相机标定的过程中,可以先创建一个QT应用程序窗口来进行图像显示和交互操作。通过OpenCV库中的函数,可以读取相机采集的图像,并将其显示在QT窗口中。同时,还可以在QT窗口中添加一些按钮或者滑动条等用于选择标定模式、设置标定参数以及展示结果等。 为了进行相机标定,首先需要采集一组不同角度和位置的图像。其中包括了用于标定的棋盘格图像。接着,通过OpenCV库中的相机标定函数,可以根据这些图像计算出相机的内参矩阵和畸变系数。这些参数将用于校正图像中的畸变。 在QT窗口中,可以显示标定结果以及标定参数的相关信息。通过调整滑动条或按钮进行参数的设置和标定的执行。同时,还可以添加一些自定义的功能,例如保存标定结果、计算图像中特定物体的三维坐标等。 总结来说,通过QT和OpenCV的结合,可以实现对单目相机的标定功能,并在QT窗口中显示结果和进行交互操作。这样可以在相机标定过程中提供更加灵活和友好的界面,方便用户进行操作和观察结果。 ### 回答2: Qt是一种跨平台的应用程序开发框架,OpenCV是一个广泛应用于计算机视觉领域的开源库,单目相机标定是一种通过计算相机内外参数来获得准确图像测量结果的技术,而"C"则表示使用C语言进行编程。 在使用Qt进行OpenCV单目相机标定时,首先需要通过相机拍摄多幅已知的标定图像。为了准确标定相机,这些标定图像应该包括多个不同的视角、不同的位置和不同的焦距。然后,使用OpenCV提供的函数和算法来计算相机的内外参数。 在Qt中,可以使用图形界面来实现相机标定的可视化操作,通过选择标定图像的文件路径来加载图像,并提供按钮来触发标定过程。在标定过程中,可以显示标定结果,例如相机矩阵、畸变系数和旋转矩阵等。同时,还可以计算并显示相机的投影模型、校正后的图像和立体视图等。 通过使用C语言编程,可以更好地与OpenCV的函数和算法进行集成,以便于实现各种相机标定相关的计算和处理。在编写程序时,可以使用Qt中的信号和槽机制来处理用户界面和相机标定之间的交互,通过调用OpenCV的函数来实现具体的标定功能。 总之,Qt和OpenCV可以很好地结合在一起实现单目相机的标定。Qt提供了界面设计和交互操作的便利性,而OpenCV则提供了强大的图像处理和计算功能。通过使用C语言进行编程,可以更好地与OpenCV集成,并实现各种相机标定相关的计算和处理。这样的组合可以帮助开发者更好地进行单目相机标定的应用开发。 ### 回答3: Qt是一种跨平台的应用程序开发框架,可以用于开发图形用户界面(GUI)应用程序OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。单目相机标定是计算机视觉领域中的一个重要任务,用于估计相机的内部参数和畸变系数。 在使用Qt和OpenCV进行单目相机标定的C++编程中,可以按照以下步骤进行: 1. 创建Qt应用程序,并添加OpenCV库文件和头文件的路径。 2. 导入相机标定所需的图像,图像应包含已知的校准板(通常使用棋盘格)。 3. 使用OpenCV的函数来检测校准板的角点,常用函数是`cv::findChessboardCorners`。 4. 使用OpenCV函数`cv::cornerSubPix`来进一步提高角点的准确性。 5. 通过提供校准板的实际尺寸和检测到的角点坐标,调用OpenCV的`cv::calibrateCamera`函数进行相机标定。 6. 标定完成后,可以使用标定后的相机矩阵来矫正图像,从而消除图像中的畸变。 7. 可以使用标定结果来进行立体视觉、目标检测、姿态估计等计算机视觉任务。 在Qt中,可以使用QFileDialog来选择图像文件,可以使用QImage和QPixmap来显示图像,可以使用QMessageBox来显示标定结果。 总之,使用Qt和OpenCV进行单目相机标定的C++编程需要结合两个库的功能,按照一定的步骤进行操作,最终可以得到相机的内部参数和畸变系数,为后续的计算机视觉任务提供准确的基础。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值