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)
还没有任何评论哟~
