OpenCV——单目相机标定

步骤:

1、制作标定板

此处制作边长2.5cm的棋盘图,规格大小为8*8,生成代码如下所示

//编程环境:VS2013, X64,OpenCV3.0.0  
#include   
#include   
#include   

using namespace std;
using namespace cv;

int main(){
	//单位转换  
	int dot_per_inch = 96;  //我的电脑是96DPI(dot per inch)  
	double cm_to_inch = 0.3937; //1cm=0.3937inch  
	double inch_to_cm = 2.54;   //1inch = 2.54cm  
	double inch_per_dot = 1.0 / 96.0;

	//自定义标定板  
	double blockSize_cm = 2.5; //方格尺寸:边长2.5cm的正方形  
	int blockNum = 8; //8*8个方格  


	int blockSize = (int)(blockSize_cm / inch_to_cm *dot_per_inch);
	cout << blockSize << endl;

	int imageSize = blockSize * blockNum;
	cout << imageSize << endl;
	Mat chessBoard(imageSize, imageSize, CV_8UC3, Scalar::all(0));
	unsigned char color = 0;

	for (int i = 0; i < imageSize; i = i + blockSize){
		color = ~color;
		for (int j = 0; j < imageSize; j = j + blockSize){
			Mat ROI = chessBoard(Rect(i, j, blockSize, blockSize));
			ROI.setTo(Scalar::all(color));
			color = ~color;
		}
	}
	imshow("Chess board", chessBoard);
	imwrite("chessBoard.jpg", chessBoard);
	cvWaitKey(3000);
	return 0;
}

标定时,只需将其在电脑上打开,然后用摄像头采集图片即可。
生成的棋盘图如下图所示
OpenCV——单目相机标定_第1张图片

2、采集20张样本图片

这里写好一个基于opencv调用摄像头的图片采集程序,有需要的到此处下载
https://download.csdn.net/download/csdn_dzh/10392958

下载后,将代码复制到VS的win32控制台程序中,运行,对着棋盘格图片按空格采集20张图片即可,如下图
OpenCV——单目相机标定_第2张图片

采集结果:
OpenCV——单目相机标定_第3张图片

3、运行相机标定程序

此处下载
https://download.csdn.net/download/csdn_dzh/10392972
下载后,需要修改的地方:

  1. calibrate.cpp中
str << "C:\\Users\\...\\pic" << i << ".jpg";

这里就是刚才采集图片的地址,与2中的地址保持一致即可
2. cv::Size boardSize(6,4);//比如这里就是6*4,根据你做的棋盘格来改
OpenCV——单目相机标定_第4张图片
3. 如果你需要输出畸变矩阵
在输出内参矩阵的后面加上

	//打印畸变系数矩阵(1*5矩阵)
	cv::Mat distCoeffs = cameraCalibrator.getDistCoeffs();
	std::cout << "畸变系数矩阵:" << distCoeffs.rows << "x" << distCoeffs.cols << std::endl;
	for (int i = 0; i<distCoeffs.rows; i++)
		for (int j = 0; j<distCoeffs.cols; j++)
			std::cout << distCoeffs.at<double>(i, j) << "\t";```
  1. 如果需要将结果保存至xml文件
    http://lib.csdn.net/article/opencv/25718
	// save the calibration result
	cv::FileStorage camcalibrate("camcalibrate.xml", cv::FileStorage::WRITE);
	camcalibrate << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs.t();
	camcalibrate.release();

这里我用了3种不同的方式采集不同的图片,得到了不同的结果,分别是
1)直接对电脑图形采样(8*8棋盘格 正方形边长2.5cm)
得到的结果
这里写图片描述

2)打印棋盘格采样(8*8棋盘格 正方形边长2.5cm)
这里写图片描述

3)直接对电脑图形采样(8*8棋盘格 正方形边长1.5cm)
这里写图片描述

4)直接对电脑图形采样(6*6棋盘格 正方形边长1.5cm)
这里写图片描述

你可能感兴趣的:(OpenCV)