opencv3计算摄像头内参

ORB-SLAM2跑单目SLAM需要设定相机参数到yaml文件,这里来说下如何利用opencv进行相机参数设定。

环境

Win10,VS2015+opencv3.3.1

对摄像机进行标定可以使用直接使用摄像头也可以事先拍好照片。利用自己摄像头批量拍摄图片见:[opencv3调用笔记本摄像头批量拍摄图片]。(http://blog.csdn.net/xiangxianghehe/article/details/78807480)本文采用的是事先拍好照片,这里的照片采用的是openCV3.3.1源码自带的图片。图片位置在E:\opencv331\opencv\sources\samples\data目录下,见下图所示:

这里写图片描述

图片包括:

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

然后把E:\opencv331\opencv\sources\samples\cpp目录下的imagelist_creator.cpp复制到vs2015,生成相应的imagelist_creator.exe程序。

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

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

打开cmd,输入imagelist_creator.exe的目录,把上面的所有图片也复制到该目录下,执行:

.\imagelist_creator.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

最后会在该目录下生成一个imglist.yaml文本。

接下来移除imagelist_creator.cpp 添加 calibration.cpp (位置也在E:\opencv331\opencv\sources\samples\cpp),在VS2015中生成相应的calibration.exe程序。

然后把calibration.exe和上面那些图片放到一块,执行:

calibration 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: "Fri Dec 15 09:19:01 2017"
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.3808563111306648e+02, 0., 3.3835479559418872e+02, 0.,
       5.3808563111306648e+02, 2.3777463358152289e+02, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 5
   cols: 1
   dt: d
   data: [ -2.5774810082335281e-01, -1.7574789818449569e-02,
       3.3574790381937572e-03, -1.6854410675885354e-03,
       1.1661187368903274e-01 ]
avg_reprojection_error: 5.4152140921563863e-01

至此,大功告成!!

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值