zoukankan      html  css  js  c++  java
  • 基于OpenCV单目相机的快速标定源码、工程、实现过程

      相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享。

    1.单目相机标定的工程源码

      首先请到同性交友网站Github上下载工程源码(https://github.com/Zhanggx0102/Camera_Calibration),注意以下几点:

    1).这是一个MS Visual Studio 2010的工程源码(版本是201x都可以)。

    2).在编译运行之前请先在VS中配置好OpenCV(网上搜索有很多图文并茂的教程),OpenCV的各个版本应该都兼容,我使用的是2.4.6。

    3).这个工程源码不是个人编写,而是我直接从OpenCV中拷贝出来的。

      完成上述配置之后你会发现项目中的源文件有以下几项:

      camera_calibration.cpp----相机标定的源码

      in_Arlco_Camera_data.xml----某款相机的标定参数配置文件

      Arlco_Camera.xml----某款相机的标定用图片索引文件

      in_Logitech_C170.xml----另一款相机的标定参数配置文件

      Logitech_C170.xml----另一款相机的标定用图片索引文件

    此时如果点击运行则标定的是Arlco相机,且标定使用的是预先拍好的图片

    2.相机标定的配置过程。

      经过第一部分的介绍,下面你要做的就是更改配置来标定你自己的相机(注意:这个时候你已经打印了一张自己的标定黑白棋盘),请紧跟下列步骤:

    1).在工程目录中找到文件in_Arlco_Camera_data.xml,复制一份改个名字如:in_YourCam_Camera_data.xml 放置在同样的文件夹下,表示这是你自己的相机标定配置文件。

    2).修改camera_calibration.cpp源代码中的217行

        const string inputSettingsFile = argc > 1 ? argv[1] : "in_Arlco_Camera_data.xml";

    改为你刚才复制的自己的配置文件,例如:

        const string inputSettingsFile = argc > 1 ? argv[1] : "in_YourCam_Camera_data.xml";

    3).修改你自己的相机标定配置文件in_YourCam_Camera_data.xml,具体如下:

    <!-- Number of inner corners per a item row and column. (square, circle) -->
    <BoardSize_Width>7</BoardSize_Width>
    <BoardSize_Height>5</BoardSize_Height>

    这一步配置你的横向和纵向角点(黑白相交的点)数,如下图所示。我的是横向7个,纵向5个,请根据自己的标定棋盘更改相应的数目。

     

    1 <!-- The size of a square in some user defined metric system (pixel, millimeter)-->
    2   <Square_Size>30</Square_Size>

     这个定义的是你的棋盘格的尺寸,我的是30mm,请根据自己的做更改。

      <!-- The type of input used for camera calibration. One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID -->
      <Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>

    这个定义的是你标定用的棋盘类型,如果你用的是黑白棋盘,不用修改。

     <Input>"Arlco_Camera.xml"</Input>
      <!--  If true (non-zero) we flip the input images around the horizontal axis.-->
      <Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis>

     这个指定的是你标定的时候采用的方式,支持一下三种:

    a. 用预先拍好的带有标定棋盘的照片进行标定。(本文采用的标定方式,下面将具体介绍方法)

    b.用预先录制好的视频进行标定(支持AVI格式)。用"/tmp/x.avi"代替源码中的"Arlco_Camera.xml"即可,其中x.avi是你录制好的带有棋盘的视频。

    c.打开相机边录制边标定。用“1”代替源码中的"Arlco_Camera.xml"即可。

    如果采用a方法,需要工程目录中找到文件Arlco_Camera.xml,复制一份改个名字如:YourCam_Camera.xml 放置在同样的文件夹下。这个里面指定了标定用的照片的存放位置和名称,具体代码如下:

    <?xml version="1.0"?>
    <opencv_storage>
    <images>
    imges/1.jpg
    imges/2.jpg
    imges/3.jpg
    imges/4.jpg
    imges/5.jpg
    imges/6.jpg
    imges/7.jpg
    imges/8.jpg
    imges/9.jpg
    imges/10.jpg
    imges/11.jpg
    imges/12.jpg
    imges/13.jpg
    imges/14.jpg
    imges/15.jpg
    imges/16.jpg
    imges/17.jpg
    imges/18.jpg
    imges/19.jpg
    imges/20.jpg
    imges/21.jpg
    imges/22.jpg
    imges/23.jpg
    imges/24.jpg
    imges/25.jpg
    imges/26.jpg
    imges/27.jpg
    </images>
    </opencv_storage>

     你不需要修改,只需要把工程目录下的imges文件夹里的图片换成你自己的就可以了,图片名称还是用1~27的数字。

    继续回到in_YourCam_Camera_data.xml文件修改参数:

      <!-- How many frames to use, for calibration. -->
      <Calibrate_NrOfFrameToUse>27</Calibrate_NrOfFrameToUse>

     这里27指定了你预先拍照的数量,可以修改,但是需要相应的修改YourCam_Camera.xml文件。

      <!-- The name of the output log file. -->
      <Write_outputFileName>"out_Arlco_Camera_data.yml"</Write_outputFileName>

     这里指定的是你的标定参数保存的文件名称,用自己的名字如:out_YourCam_Camera_data.yml 代替:out_Arlco_Camera_data.yml 即可。

    ok,其余的参数用默认即可,这个时候请把你修改好的文件:in_YourCam_Camera_data.xml 和 YourCam_Camera.xml 添加到工程项目的源码中。

      此时点击运行口可以标定你自己的相机了,最后的结果会保存在工程目录下,名字就是上一步你自己设置的out_YourCam_Camera_data.yml。

    标定过程如下图所示:

    完成后你就可以看到相机内参、外参以及畸变系数了,部分数据如下:

    %YAML:1.0
    calibration_Time: "09/02/17 14:27:10"
    nrOfFrames: 27
    image_Width: 1280
    image_Height: 720
    board_Width: 7
    board_Height: 5
    square_Size: 30.
    FixAspectRatio: 1.
    # flags:  +fix_aspectRatio +fix_principal_point +zero_tangent_dist
    flagValue: 14
    Camera_Matrix: !!opencv-matrix
       rows: 3
       cols: 3
       dt: d
       data: [ 1.0078520005023535e+003, 0., 6.3950000000000000e+002, 0.,
           1.0078520005023535e+003, 3.5950000000000000e+002, 0., 0., 1. ]
    Distortion_Coefficients: !!opencv-matrix
       rows: 5
       cols: 1
       dt: d
       data: [ -4.9694653328469340e-002, 2.3886698343464000e-001, 0., 0.,
           -2.1783942538569392e-001 ]
    Avg_Reprojection_Error: 6.4271522441441153e-001
    Per_View_Reprojection_Errors: !!opencv-matrix
       rows: 27
       cols: 1
       dt: f
       data: [ 3.89407665e-001, 4.69866753e-001, 3.74819994e-001,
           4.79580641e-001, 2.85050988e-001, 3.93756509e-001,
           9.21430171e-001, 7.79153645e-001, 6.87648296e-001,
           6.19106829e-001, 6.83992207e-001, 6.41160131e-001,
           2.52024829e-001, 2.94729859e-001, 4.55538809e-001,
           7.44070828e-001, 4.21751559e-001, 5.13929784e-001,
           6.03685081e-001, 1.09411442e+000, 1.20731401e+000,
           8.70341241e-001, 3.22936684e-001, 4.73881990e-001,
           8.06841075e-001, 6.78049505e-001 ]

    我用的图片是1280x720的,这个数据是根据你用的标定图片得出的。

    3.总结

      本文是为视觉入门者准备的,后续我会陆续介绍在linux下的标定过程,包括用其他开源库如ArUco等的标定方法。

    作者:Shawn

  • 相关阅读:
    /etc/fstab 文件如何填写(转)
    在linux下PHP和Mysql环境搞事情
    nginx 添加的配置信息
    查看服务器硬件信息
    Centos下的SVN搭建
    20170413B端业务访问故障排查思路
    快速搭建BIND服务,并实现解析
    零基础学python-19.1 列表解析与序列映射函数map
    零基础学python-18.10 函数式编程工具:filter和reduce
    零基础学python-18.9 序列映射函数:map
  • 原文地址:https://www.cnblogs.com/shawn0102/p/7466870.html
Copyright © 2011-2022 走看看