如何用openCV实现VP中的CogCalibCheckerboardTool校正工具功能

    前面文章大概介绍了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)点转换为机器人或其他设备坐标系

你可能感兴趣的:(视觉,CCD,opencv,计算机视觉)