OpenCV 相机参数标定(Camera Calibration

2018-03-27  本文已影响0人  Wafei

本文参考链接:https://www.jianshu.com/p/9a4d9f9dfedc
感谢原博主~


本文介绍使用OpenCV程序来进行相机标定,并根据自己的摄像机参数来修改ORB-SLAM2使用的yaml文件。

操作系统:Ubuntu16.04 LTS
OpenCV版本:3.4.1
摄像头:640×480像素 单目摄像头

标定步骤

1、找到标定例程
进入OpenCV安装目录,找到samples/cpp/tutorial_code/calib3d/camera_calibration目录,把它拷贝到一个合适的位置。(因为可能需要修改一些代码,因此不建议直接在原目录下使用。)

2、修改标定配置参数
找到camera_calibration/in_VID5.xml文件,这是标定程序使用的配置文件,需要设置里面的几个参数。

棋盘格的宽度和高度,宽度9 高度6。

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

需要特别注意的是,这里的宽度和高度是指内部交叉点的个数,而不是方形格的个数。如下图所示的棋盘格,内部交叉点的宽度是9,高度是6。请务必填写正确,否则无法标定。


棋盘图

每格的宽度
每格的宽度应设置为实际的毫米数,该参数的实际用途尚待考证。目前看来,即使设置的不准确也无大碍。我使用默认参数50。

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

选择输入方式
例程提供了三种输入方式。不过,如果待标定的摄像头已经接入电脑,建议使用input camera方式。该方式只需要设置视频输入设备号,对于笔记本电脑来说,通常0表示笔记本自带摄像头,1表示外接摄像头。

  <!-- The input to use for calibration. 
        To use an input camera -> give the ID of the camera, like "1"
        To use an input video  -> give the path of the input video, like "/tmp/x.avi"
        To use an image list   -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
        -->
<Input>"1"</Input>

3、编译
新建camera_calibration/CMakeLists.txt文件,写入如下内容。

project(Camera_Calibration)
set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV 3.0 QUIET)
if(NOT OpenCV_FOUND)    
    find_package(OpenCV 2.4.3 QUIET)
    if(NOT OpenCV_FOUND)
        message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
    endif()
endif()

include_directories(${OpenCV_INCLUDE_DIR})
add_executable(Camera_Calibration camera_calibration.cpp)
target_link_libraries(Camera_Calibration ${OpenCV_LIBS})

编译

mkdir build
cd build
cmake ..
make

4、运行
运行时需要传入配置文件作为主函数的参数:

./Camera_Calibration ../in_VID5.xml

程序启动后会出现当前摄像头拍摄到的画面,画面里有操作提示。按下键盘'g'键开始标定。请务必使摄像头从不同方向拍摄棋盘格,以保证程序准确计算图像畸变。


标定程序

共拍摄25张照片后自动结束标定,标定结果写入camera_calibration/out_camera_data.xml

这里有一些注意事项:

可以直接在另一台电脑屏幕上显示棋盘格,而不必打印出来。屏幕上显示的棋盘格更平整,不会引入额外的误差。
要在上下左右各个角度拍摄棋盘格,以减少各个图片间的相关性,有利于求解相机参数和畸变系数。

5、修改成ORB-SLAM2工程可用的yaml文件
OK,我们先参考原来TUM数据集的yaml文件,目录在/ORB-SLAM2/Examples/Monocular/TUM1.yaml
Copy一份作为自己摄像头的参数,命名为MyCam.yaml
我们根据out_camera_data.xml文件里的相机矩阵(camera_matrix),来填写自己摄像头的数据。(由于OpenCV标定出来的文件,畸变参数好像和ORB-SLAM2使用的畸变参数略有不同,这里先不填,只填上相机矩阵的参数。)


上一篇下一篇

猜你喜欢

热点阅读