相机标定(标题为什么要5个字?)

标定的意义

z老师跟我们说,当代的制作工艺无法做出完美的凸透镜,所以在镜头所拍摄画面的边缘,图像会有一定的畸变,我们标定的意义,就是用OpenCV自带的方法,算出一系列的参数,通过数学的计算,纠正这种畸变

标定用具

相机标定(标题为什么要5个字?)_第1张图片
没错就这个就行啦不还有你的脑子

标定步骤

1、找到标定例程

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

2、修改标定配置参数

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

①圆点格的宽度和高度

由于我们实际使用的是圆点格,所以我们需要调整的参数较多

显然这里是7行7列

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

然后还有一个地方我们需要改成CIRCLES_GRID,表示我们用的是圆点格

②每格的宽度

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

<!‐‐ The size of a square in some user defined metric system (pixel, mill
imeter)‐‐>
<Square_Size>20</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>"0"</Input>

3、编译

编译当然需要CMakeLists.txt,所以我们新建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
./Camera_Calibration

这个时候会报错,报的是

Could not open the configuration file: "default.xml"
...(这里省略10086行)

是因为你在./运行的时候没有传参数

所以我们重新在终端中输入

./Camera_Calibration ../in_VID5.xml

这样就可以打开摄像头了

注意: 如果没有打开,可能是第③步设置相机编号的时候不对,这个时候可以适当穷举0,1,2,3,...

然后在跳出来的摄像头画面中,底部会有一个"Press 'g' to start"(不解释了,大家都是考上来的哈),将你的摄像头对准我们需要标定的板子后,摄像头中的画面会变为
相机标定(标题为什么要5个字?)_第2张图片
g开始后,画面的颜色会反转(也许不是?反正会变化),会计数n/25,我们拍满25张图片后,这一次标定就完成了,会在终端中返回你这次标定的结果,数值越小越好(z老师说小于0.2就算标定完成)。

至此,标定完成(标定结果会存在camera_calibration/out_camera_data.xml中),当然你也可以多次标定,但是两次标定的结果不会互相影响(越标越好是不存在的喂!),直到返回一个你满意的值为止。

数学原理我就不讲了,我也不会(我可以一直挖坑的),后面了解了再写博客

你可能感兴趣的:(RoboMaster,opencv,相机标定)