标签:
二 ubuntu下Opencv的相机标定
一般直接用Opencv的源码就可以进行相机的标定,但是可能只是会实现结果,却不懂实现的过程,我也是模模糊糊的看了《计算机视觉中的多视图几何》以及实现一些经典的算法,对Opencv有一些了解才开始做相机的标定,直接上源码
网上有很多关于相机标定的代码,但都是没有官方网站的源文件更详细,那是给源文件同时写一个Makefile文件
#Makefile for camera_calibrateion EXE =camera_calibration OBJS += camera_calibration.o CC = g++ CFLAGS += -g -O3 -Wall INC += -I. `pkg-config --cflags opencv` LIBS += `pkg-config --libs opencv` all:$(EXE) $(EXE):$(OBJS) $(CC) $(INC) $(CFLAGS) $(OBJS) -o $(EXE) $(LIBS) $(OBJS):%.o:%.cpp $(CC) $(INC) $(CFLAGS) -c $< -o $@ .PHONY:clean clean: rm -r *.o $(EXE)
然后make一下就会生成可执行文件,那么同时还要有一个配置文件 .xml 要在同一个目录文件下,原文件提供了三种方式进行标定,
(1) 直接输入摄像头信息 (2)采用已经采集好的多照不同位置的标定模板 (3 )使用采集下的视频流文件
那么我这里只做了(1) (2)并且标定不同的摄像头
(1)采用摄像头的输入方式的mycamera.xml 代码如下:(同时要在camera_calibration.cpp文件里更改读取的.xml文件)
(这里的标定模板我是用A3纸张打印出来,为8*6 35mm的标定棋盘)
<?xml version="1.0"?> <opencv_storage> <!--设置标定参数--> <Settings> <!-- Number of inner corners per a item row and column. 宽度和高度的设置(square, circle) --> <BoardSize_Width> 8</BoardSize_Width> <BoardSize_Height>6</BoardSize_Height> <!-- The size of a square in some user defined metric system 每个方格的边长的长度单位一般是mm(pixel, millimeter)--> <Square_Size>35</Square_Size> <!-- The type of input used for camera calibration. 标定模板的样式(棋盘) 这里一共有三种模板One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID --> <Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern> <!-- 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> <!-- If true (non-zero) we flip the input images around the horizontal axis. 如果为真(非零),安照垂直方向翻转输入图像,这里选择为零,即不翻转--> <Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis> <!-- Time delay between frames in case of camera.在使用相机的情况下的帧之间的时间延迟 --> <Input_Delay>100</Input_Delay> <!-- How many frames to use, for calibration.用多少帧照片去校准,可以自己设置,一般不能低于20个 --> <Calibrate_NrOfFrameToUse>25</Calibrate_NrOfFrameToUse> <!-- Consider only fy as a free parameter, the ratio fx/fy stays the same as in the input cameraMatrix. Use or not setting. 0 - False Non-Zero - True 假设fy是一个自由参数,而fx/fy是一个固定的比例参数,使用或者不设置 0 假 非零 真--> <Calibrate_FixAspectRatio> 1 </Calibrate_FixAspectRatio> <!-- If true (non-zero) tangential distortion coefficients are set to zeros and stay zero. 如果设置为真,表示切向畸变系数被设置为0 保持为零--> <Calibrate_AssumeZeroTangentialDistortion>1</Calibrate_AssumeZeroTangentialDistortion> <!-- If true (non-zero) the principal point(摄像机坐标系下真实的坐标原点) is not changed during the global optimization.--> <Calibrate_FixPrincipalPointAtTheCenter> 1 </Calibrate_FixPrincipalPointAtTheCenter> <!-- The name of the output log file. 输出文件的名称--> <Write_outputFileName>"out_camera_data.xml"</Write_outputFileName> <!-- If true (non-zero) we write to the output file the feature points.(如果为真我们向输出文件写入特征点)--> <Write_DetectedFeaturePoints>1</Write_DetectedFeaturePoints> <!-- If true (non-zero) we write to the output file the extrinsic camera parameters.(写入相机的外部参数)--> <Write_extrinsicParameters>1</Write_extrinsicParameters> <!-- If true (non-zero) we show after calibration the undistorted images.展示校准后不失真的照片--> <Show_UndistortedImage>1</Show_UndistortedImage> </Settings> </opencv_storage>
里面的汉字是我写的标注,其中有几个地方需要修改的与我们的实际标定模板一致
<BoardSize_Width> 8</BoardSize_Width> :表示标定模板的宽度 实际一共有9个黑白方格
<BoardSize_Height>6</BoardSize_Height> :实际有7个黑白方格
<Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>
:选择棋盘形式,一共有 CHESSBOARD ,CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID三种
<Square_Size>35</Square_Size> :每个黑白方格的边长35mm(根据实际情况)
<Input>"1"</Input> :选择标定模板的输入种类 1. To use an input camera -> give the ID of the camera, like "1"
2. To use an input video -> give the path of the input video, like "/tmp/x.avi"
3. To use an image list -> give the path to the XML or YAML file containing the list of the images, <Write_outputFileName>"out_camera_data.xml"</Write_outputFileName>
<Write_outputFileName>"out_camera_data.xml"</Write_outputFileName> :表示标定输出文件
运行文件夹下运行./camera_calibration 会启动摄像头,然后选择“g”开始标定 ,但是如果上面的这些参数没有设置的与实际相符合,是不会开始采集标定模板的,(我刚开始就出现了这个错误,所以一定亚设置与实际的标定模板一致)
就会开始采集25个不同角度和位置的标定模板,如下图:
每采集成功一次就会变为二图,颜色略有变化,采集完成就会自动开始校准如下:
此时在工程文件夹下就会生成out_camera_data.xml,就是相机的标定结果报告
(2)使用Opencv 提供的标定模板进行标定
我们只需要更改
<BoardSize_Width> 8</BoardSize_Width> 改为 <BoardSize_Width> 6</BoardSize_Width> <BoardSize_Height>6</BoardSize_Height> 改为 <BoardSize_Height>6</BoardSize_Height>
<Square_Size>35</Square_Size> 改为 <Square_Size108</Square_Size>
<Input>"1"</Input> 改为 <Input>"/home/salm/myopencv/calibrate/VID.xml"</Input>
这里就是指定了另一个.xml文件,就是标定模板的图片,其中VID.xml内容为:
<?xml version="1.0"?> <opencv_storage> <images> /home/salm/myopencv/images/chessboards/chessboard01.jpg /home/salm/myopencv/images/chessboards/chessboard02.jpg /home/salm/myopencv/images/chessboards/chessboard03.jpg /home/salm/myopencv/images/chessboards/chessboard04.jpg /home/salm/myopencv/images/chessboards/chessboard05.jpg /home/salm/myopencv/images/chessboards/chessboard06.jpg /home/salm/myopencv/images/chessboards/chessboard07.jpg /home/salm/myopencv/images/chessboards/chessboard08.jpg /home/salm/myopencv/images/chessboards/chessboard09.jpg /home/salm/myopencv/images/chessboards/chessboard10.jpg /home/salm/myopencv/images/chessboards/chessboard11.jpg /home/salm/myopencv/images/chessboards/chessboard12.jpg /home/salm/myopencv/images/chessboards/chessboard13.jpg /home/salm/myopencv/images/chessboards/chessboard14.jpg /home/salm/myopencv/images/chessboards/chessboard15.jpg /home/salm/myopencv/images/chessboards/chessboard16.jpg /home/salm/myopencv/images/chessboards/chessboard17.jpg /home/salm/myopencv/images/chessboards/chessboard18.jpg /home/salm/myopencv/images/chessboards/chessboard19.jpg /home/salm/myopencv/images/chessboards/chessboard20.jpg /home/salm/myopencv/images/chessboards/chessboard21.jpg /home/salm/myopencv/images/chessboards/chessboard22.jpg /home/salm/myopencv/images/chessboards/chessboard23.jpg /home/salm/myopencv/images/chessboards/chessboard24.jpg /home/salm/myopencv/images/chessboards/chessboard25.jpg </images> </opencv_storage>
运行文件夹下运行./camera_calibration 会启动VID.xml文件下的图片,这是标定过程中的截图文件 如图
此时在工程文件夹下就会生成out_camera_data.xml,(这里就是覆盖了上一次的标定数据)
相机标定 matlab opencv ROS三种方法标定步骤(2)
标签:
原文地址:http://www.cnblogs.com/li-yao7758258/p/5933653.html