Opencv3.4.1学习 vs+win7下摄像机内参标定

4 篇文章 0 订阅
4 篇文章 0 订阅

下面是教材《深入理解OpenCV 实用计算机视觉项目解析》78页的原话

摄像机的内参数可利用OpenCV发布包中的示例程序camera_cailbration.exe来计算。该程序会使用一系列模式图像来找到内部透镜参数,例如:焦距、主点、失真系数。例如:有一组来自于不同角度用于标定的模式图像,总共有8张图像。
通过以下命令方式执行标定
imageliet_creator imagelist.yaml *.png
calibration -w 9 -h 6 -o camera_intrinsic.yaml imagelist.yaml
第一条命令将创建YAML格式的一个图像列表,校验工具希望将当前目录中所有PNG文件作为输入,也可以使用完整的文件名。然后将生成的文件imagelist.yaml传递给标定程序。此外,标定工具可以从一个普通的摄像机获取图像
指定校正模式的维度、输入文件以及将写入标定数据的输出文件。
标定完成后,会得到一个YAML文件

开始

参考: https://blog.csdn.net/xiangxianghehe/article/details/78807920

1.准备图片

使用openCV3.4.1源码自带的图片

https://github.com/opencv/opencv/releases/tag/3.4.1
github上下载:opencv-3.4.1-vc14_vc15.exe,安装,从文件夹找到:opencv\sources\samples\data,如图
在这里插入图片描述

2.生成imglist.yaml文本

启动vs2017,在:F:\opencv3.4.1下创建C++空项目:Cameracalibration,添加新文件main.cpp,然后把:opencv\sources\samples\cpp目录下的:imagelist_creator.cpp复制到main.cpp,生成相应的:Cameracalibration.exe程序。
imagelist_creator.cpp如下

/*this creates a yaml or xml list of files from the command line args
 */

#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <string>
#include <iostream>

using std::string;
using std::cout;
using std::endl;

using namespace cv;

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;
}

int main(int ac, char** av)
{
  cv::CommandLineParser parser(ac, av, "{help h||}{@output||}");
  if (parser.has("help"))
  {
    help(av);
    return 0;
  }
  string outputname = parser.get<string>("@output");

  if (outputname.empty())
  {
    help(av);
    return 1;
  }

  Mat m = imread(outputname); //check if the output is an image - prevent overwrites!
  if(!m.empty()){
    std::cerr << "fail! Please specify an output file, don't want to overwrite you images!" << endl;
    help(av);
    return 1;
  }

  FileStorage fs(outputname, FileStorage::WRITE);
  fs << "images" << "[";
  for(int i = 2; i < ac; i++){
    fs << string(av[i]);
  }
  fs << "]";
  return 0;
}

将left01-14.jpg,right01-14.jpg拷贝到Cameracalibration.exe所在文件夹
打开cmd,先跳转到Cameracalibration.exe(项目名为Cameracalibration)所在目录,输入:F:跳转到F盘,然后输入:cd opencv3.4.1\Cameracalibration\x64\Debug,执行如下命令行

.\Cameracalibration.exe imglist.yaml left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpgleft07.jpg left08.jpg left09.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 right11.jpg right12.jpg right13.jpg right14.jpg

.\Cameracalibration.exe前面的.\表示当前目录下
在这里插入图片描述
可以看到,会在该目录下生成一个imglist.yaml文本。
在这里插入图片描述
imglist.yaml文本内容如下

%YAML:1.0
---
images:
   - "left01.jpg"
   - "left02.jpg"
   - "left03.jpg"
   - "left04.jpg"
   - "left05.jpg"
   - "left06.jpgleft07.jpg"
   - "left08.jpg"
   - "left09.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"
   - "right11.jpg"
   - "right12.jpg"
   - "right13.jpg"
   - "right14.jpg"

生成out_camera_data.yml文件

接下来将main.cpp内容换成:calibration.cpp (位置也在opencv\sources\samples\cpp),在VS2017中生成相应的Cameracalibration.exe程序。

期间出现错误:C4996 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
在这里插入图片描述
参考: https://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html
在工程文件名处右击鼠标打开快捷菜单,找到“属性”选项,进入项目属性页面,在属性页面中找到“C/C++"–>”预处理器“,在“预处理器定义” 中,添加 :_CRT_SECURE_NO_WARNINGS,再次编译并运行即可正常运行

此时calibration.exe和上面那些图片已经在同一目录,打开cmd,执行一下三步:
1.跳到F盘:F:
2.调到文件目录:cd opencv3.4.1\Cameracalibration\x64\Debug
3.执行命令行:.\Cameracalibration imglist.yaml left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpgleft07.jpg left08.jpg left09.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 right11.jpg right12.jpg right13.jpg right14.jpg -w=6 -h=9
会打印出

RMS error reported by calibrateCamera: 0.541522
Calibration succeeded. avg reprojection error = 0.54

在这里插入图片描述
还会在同一目录生成一个out_camera_data.yml文件,内容如下:

%YAML:1.0
---
calibration_time: "Mon May 13 09:26:56 2019"
image_width: 640
image_height: 480
board_width: 6
board_height: 9
square_size: 1.
aspectRatio: 1.
flags: 2
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 5.3808562490205657e+02, 0., 3.3835479720806154e+02, 0.,
       5.3808562490205657e+02, 2.3777462223446776e+02, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 5
   cols: 1
   dt: d
   data: [ -2.5774802881531605e-01, -1.7575205891413051e-02,
       3.3574782433024733e-03, -1.6854401941563681e-03,
       1.1661231980890167e-01 ]
avg_reprojection_error: 5.4152148431251057e-01

搞定

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值