Advertisement

OpenCV 立体视觉详细解析(一)---摄像头标定

阅读量:

因为Learning Opencv中的摄像头标定实例测得的结果精度较低,因此改用Matlab进行标定。

下载标定工具包TOOLBOX_calib.zip

访问Caltech Vision Lab获取Calibration Toolbox

解压完成后,请启动MATLAB(请注意,在启动MATLAB时必须在根权限下运行它,否则可能会出现无法加载的问题)。然后将当前目录设置为TOOLBOX_calib文件夹。

在command line中运行calib_gui,会出现

有两种模式可以选择:

选择standard。

用摄像头照10幅棋盘的图片,命名为right1~right10,放到工具箱的目录中:

点击image names.

会提示让输入文件的basename也就是right和图片格式

可以看到图片被加载了。

然后点击Extract grid_corners,提取角点。

第一个默认选择全部图片

最后一个也是默认

会出现一幅图片,用鼠标点击四个顶角点,便会自动检测出其他的角点。

然后默认

第一次检测会让输入方格的size(单位是毫米)

我用的是53mm

然后重复10次检测。

然后点击Calibration

得出结果:

也可以打开Calib_Results.m文件查看。

Intrinsics.xml(内参数矩阵)

在标定的过程中使用内参数和畸变参数。

其中内参数有4个(fx,fy,cx,cy)。

畸变参数5个,三个径向,两个切向。

在OpenCV函数使用的相关参数中包含指定的文件格式信息,在上述提到的两个关键参数需要配置至指定配置文件中时,则即可完成摄像头标定过程

Intrinsics.xml(内参数矩阵)

Distortion.xml(畸变系数)

也可以在程序中手动输入:

复制代码
 #include "opencv2/opencv.hpp"

    
 #include <iostream>
    
  
    
 using namespace cv;
    
 using namespace std;
    
  
    
 int main()
    
 {
    
  
    
 	Mat frame = imread("chess0.jpg", 1);
    
  
    
 	Mat cameraMatrix = Mat::eye(3, 3, CV_64F);
    
 	cameraMatrix.at<double>(0, 0) = 1985.613682069706;
    
 	cameraMatrix.at<double>(0, 1) = 0;
    
 	cameraMatrix.at<double>(0, 2) = 657.8623472636178;
    
 	cameraMatrix.at<double>(1, 0) = 0;
    
 	cameraMatrix.at<double>(1, 1) = 1988.647643756177;
    
 	cameraMatrix.at<double>(1, 2) = 302.2970641371338;
    
 	cameraMatrix.at<double>(2, 0) = 0;
    
 	cameraMatrix.at<double>(2, 1) = 0;
    
 	cameraMatrix.at<double>(2, 2) = 1;
    
  
    
 	Mat distCoeffs = Mat::zeros(5, 1, CV_64F);
    
 	distCoeffs.at<double>(0, 0) = -0.7482923935033831;
    
 	distCoeffs.at<double>(1, 0) = 2.187022164734784;
    
 	distCoeffs.at<double>(2, 0) = -0.01242851063048162;
    
 	distCoeffs.at<double>(3, 0) = 0.01152359082499158;
    
 	distCoeffs.at<double>(4, 0) = -7.501952253621245;
    
  
    
 	
    
 	Size imageSize;
    
 	imageSize = frame.size();
    
  
    
 	Mat mapx = Mat(imageSize, CV_32FC1);
    
 	Mat mapy = Mat(imageSize, CV_32FC1);
    
 	Mat R = Mat::eye(3, 3, CV_32F);
    
  
    
 	initUndistortRectifyMap(cameraMatrix, distCoeffs, R,
    
 	getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),
    
 		imageSize, CV_32FC1, mapx, mapy);
    
  
    
 	Mat result = frame.clone();
    
 	remap(frame, result, mapx, mapy, INTER_LINEAR);
    
 	imshow("Origianl", frame);
    
 	imshow("Calibration", result);
    
 	waitKey(0);
    
 	return 0;
    
 }
    
    
    
    
    代码解读

全部评论 (0)

还没有任何评论哟~