码迷,mamicode.com
首页 > 其他好文 > 详细

相机标定 matlab opencv ROS三种方法标定步骤(2)

时间:2016-10-06 13:00:23      阅读:692      评论:0      收藏:0      [点我收藏+]

标签:

二  ubuntu下Opencv的相机标定

        一般直接用Opencv的源码就可以进行相机的标定,但是可能只是会实现结果,却不懂实现的过程,我也是模模糊糊的看了《计算机视觉中的多视图几何》以及实现一些经典的算法,对Opencv有一些了解才开始做相机的标定,直接上源码

技术分享View Code

 网上有很多关于相机标定的代码,但都是没有官方网站的源文件更详细,那是给源文件同时写一个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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!