前面文章大概介绍了VP的CogCalibCheckerboardTool工具主要是来校正相机畸变的,VP平台好用是好用不过需要加密狗才能使用,而加密狗的价格也非常的昂贵,如果用开源免费平台来实现VP中的功能可以节省很大一笔费用,所以下面来介绍下如何用开源平台来实现VP中的一些工具的功能,这一篇文章先介绍下如何用openCV实现VP中的CogCalibCheckerboardTool校正工具功能:
//定义传入棋盘格图片变量
cv::Mat imtepImg = image.clone();
//定义角点集合变量
vector corners;
//定义一个30行30列角点
cv::Size board_size = cv::Size(30, 30);
//findChessboardCorners函数找到角点坐标
bool patter = cv::findChessboardCorners(image, board_size, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE);
//如果未找到角点终止返回
if (!patter)
{
return;
}
//对像素坐标进行亚精度操作,提高精度
cv::cornerSubPix(image, corners, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
//在棋盘格上找到的所有角点画半径为3的小圈圈
for (int i = 0; i < corners.size(); i++)
{
cv::circle(imtepImg, corners[i], 3, cv::Scalar(255, 0, 0), 2);
}
// 把找到的角点描绘出来
cv::drawChessboardCorners(colorImg, board_size, corners, patter);
//单个棋盘格大小 mm
cv::Size square_size = cv::Size(5, 5);
//创建 3*3 全零的 float 矩阵,用来保存相机内参
cv::Mat cameraMatrix = cv::Mat(3, 3, CV_32FC1, cv::Scalar::all(0));
//创建 1行5列的全零 float 矩阵,用来保存畸变参数
cv::Mat distcoeffs = cv::Mat(1, 5, CV_32FC1, cv::Scalar::all(0));
// 创建图像旋转向量
vector tvecsMat;
//创建图像平移向量
vector rvecsMat;
//保存各角点的物理坐标 世界坐标系
vector realPoints;
//按照从左到右,从上到下的顺序排列角点坐标 每个角点的坐标是以棋盘格真实大小转换
for (int i = 0; i < board_size.height; i++)
{
for (int j = 0; j < board_size.width; j++)
{
cv::Point3f tempPoint;
tempPoint.x = i*square_size.width;
tempPoint.y = j*square_size.height;
tempPoint.z = 0;
realPoints.push_back(tempPoint);
}
}
// 可以存放多个棋盘格画面
vector> image_points;
image_points.push_back(corners);
// 对应的棋盘格真实大小角点坐标集合
vector> object_points;
object_points.push_back(realPoints);
//calibrateCamera函数计算相机畸变内参 外参等
double eps = cv::calibrateCamera(object_points, image_points, image.size(), cameraMatrix, distcoeffs, rvecsMat,
tvecsMat, CV_CALIB_FIX_K3);
double err = 0.0;
//定义畸变校正后的输出图像
cv::Mat dstImage;
//调用相机畸变内外参 得到校正后的图像
cv::undistort(image, dstImage, cameraMatrix, distcoeffs);
//定义校正后的角点坐标集
vector corner;
//在校正后的图片中找到所有的角点坐标
bool patters = cv::findChessboardCorners(dstImage, board_size, corner, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE);
//保存相机校正内外参数据
ofstream fout;
fout.open("参数文档.txt");
fout << "#cameraMatrix:\n" << cameraMatrix << endl;
fout << "#distcoeffs:\n" << distcoeffs << endl;
fout << endl;
fout.close();
dstImage就是我们想要的校正后的图片;corner 就是校正后的角点坐标 ;cameraMatrix 和 distcoeffs 就是相机的内外参数;
相机畸变校正就介绍到这,接下来 下一篇文章介绍OpenCV如何利用N(N=4)点转换为机器人或其他设备坐标系