当前位置:   article > 正文

OpenCV摄像头标定_opencv.js 摄像头标定

opencv.js 摄像头标定

本文介绍使用OpenCV自带的标定例程对单目摄像头标定的过程。

操作系统:Linux
OpenCV版本:3.2.0
摄像头:640×480像素,90度广角镜头

一、标定步骤

1、找到标定例程

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

2、修改标定配置参数

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

  1. 棋盘格的宽度和高度。
  1. <!-- Number of inner corners per a item row and column. (square, circle) -->
  2. <BoardSize_Width>9</BoardSize_Width>
  3. <BoardSize_Height>6</BoardSize_Height>

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

 

  1. 每格的宽度
    每格的宽度应设置为实际的毫米数,该参数的实际用途尚待考证。目前看来,即使设置的不准确也无大碍。
  1. <!-- The size of a square in some user defined metric system (pixel, millimeter)-->
  2. <Square_Size>20</Square_Size>
  1. 选择输入方式
    例程提供了三种输入方式。不过,如果待标定的摄像头已经接入电脑,建议使用input camera方式。该方式只需要设置视频输入设备号,对于笔记本电脑来说,通常0表示笔记本自带摄像头,1表示外接摄像头。
  1. <!-- The input to use for calibration.
  2. To use an input camera -> give the ID of the camera, like "1"
  3. To use an input video -> give the path of the input video, like "/tmp/x.avi"
  4. 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"
  5. -->
  6. <Input>"1"</Input>

3、编译

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

  1. project(Camera_Calibration)
  2. set(CMAKE_CXX_STANDARD 11)
  3. find_package(OpenCV 3.0 QUIET)
  4. if(NOT OpenCV_FOUND)
  5. find_package(OpenCV 2.4.3 QUIET)
  6. if(NOT OpenCV_FOUND)
  7. message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
  8. endif()
  9. endif()
  10. include_directories(${OpenCV_INCLUDE_DIR})
  11. add_executable(Camera_Calibration camera_calibration.cpp)
  12. target_link_libraries(Camera_Calibration ${OpenCV_LIBS})

编译

  1. wjg@wjg-PC:camera_calibration/build$ cmake ..
  2. wjg@wjg-PC:camera_calibration/build$ make

4、运行

运行时需要传入配置文件:

wjg@wjg-PC:camera_calibration/build$ Camera_Calibration ../in_VID5.xml

程序启动后会出现当前摄像头拍摄到的画面,右下角有操作提示。按下键盘'q'键开始标定。请务必使摄像头从不同方向拍摄棋盘格,以保证程序准确计算图像畸变。共拍摄25张照片后自动结束标定,标定结果写入camera_calibration/out_camera_data.xml。此时,为了查看标定效果,可以按下键盘'u'键,画面将切换到去畸变后的图像,如果畸变完全消除,则标定成功,否则应该重新标定。

这里有一些注意事项:

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

现在,就可以使用标定好的相机内参和畸变系数啦!

二、相机去畸变

有了标定好的参数,如何把输入图片的畸变去除呢?其实很简单,只需要调用OpenCV提供的一个函数就可以了:

cv::undistort(temp, frame, mK, mDistCoef);

其中,temp为原图片,frame为去畸变后的图片,mK为相机内参数矩阵,mDistCoef为畸变矩阵。后两个矩阵都可以在camera_calibration/out_camera_data.xml中找到。

三、理论知识——相机模型

光会用还不够,我们应该至少了解为什么需要标定,标定有什么用。

简单来说,标定是为了能够从空间点的像素坐标映射到世界坐标,这是3D立体视觉必须经过的过程。这一过程需要三步,第一步从畸变的像素坐标映射到去畸变的像素坐标,需要用到畸变矩阵mDistCoef;第二步从去畸变的像素坐标映射到相机坐标,需要用到相机内参数矩阵mK;第三步从相机坐标映射到世界坐标,需要用到相机外参数矩阵,也就是相机位姿变换矩阵。下图展示了第二步和第三步的过程。

关于更详细的理论知识,推荐阅读文末列出的参考资料。

四、参考资料

《视觉SLAM十四讲》第5讲 相机与图像 高翔
机器视觉的相机标定到底是什么? 知乎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/341157
推荐阅读
相关标签
  

闽ICP备14008679号