步骤:
1、制作标定板
此处制作边长2.5cm的棋盘图,规格大小为8*8,生成代码如下所示
//编程环境:VS2013, X64,OpenCV3.0.0
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\opencv.hpp>
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;
}
标定时,只需将其在电脑上打开,然后用摄像头采集图片即可。
生成的棋盘图如下图所示
2、采集20张样本图片
这里写好一个基于opencv调用摄像头的图片采集程序,有需要的到此处下载
https://download.csdn.net/download/csdn_dzh/10392958
下载后,将代码复制到VS的win32控制台程序中,运行,对着棋盘格图片按空格采集20张图片即可,如下图
采集结果:
3、运行相机标定程序
此处下载
https://download.csdn.net/download/csdn_dzh/10392972
下载后,需要修改的地方:
- calibrate.cpp中
str << "C:\\Users\\...\\pic" << i << ".jpg";
这里就是刚才采集图片的地址,与2中的地址保持一致即可
2. cv::Size boardSize(6,4);//比如这里就是6*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";```
- 如果需要将结果保存至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)
版权声明:本文为CSDN_dzh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。