• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

相机标定

互联网 diligentman 5天前 7次浏览

文章目录

  • 前言
  • 一、相机标定是什么?
  • 二、坐标系
      • 将世界坐标系中的 3D 点投射到图像平面
      • 单应性的基本概念
  • 总流程
    • 程序设计流程
      • 导入数据集
      • 导入关键点世界坐标
      • 寻找关键点精准化
      • 计算内参
  • 总结

前言

提示:。


提示:以下是本篇文章正文内容,下面案例可供参考

一、相机标定是什么?

精度
算法(稳定性)

二、坐标系

相机标定

世界坐标系和摄像机坐标系通过旋转和平移相关。
外部参数
Xw,Yw,Zw这三个参数用于平移
Xc,Yc,Yc这三个参数用于旋转

世界坐标系建为黄色,原点为自定义点
摄像机坐标系为红色,原点为相机当前位置

将世界坐标系中的 3D 点投射到图像平面

相机标定

1.3D 点使用外在矩阵从世界坐标转换为摄像机坐标,该矩阵由两个坐标系之间的旋转和平移组成。
2.摄像机坐标系中新的 3D 点使用内部矩阵投影到图像平面上,该矩阵由内部摄像机参数(如焦距、光学中心等)组成。

单应性的基本概念

参考用代码解释单应性的基本概念

总流程

:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}































































开始









收集图样信息









捕捉标定点









相机参数计算









矫正









结束








程序设计流程

:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}


















































































内参







外参







畸变参










收集图像









导入数据集









导入关键点3维坐标世界坐标系









找到关键点2维坐标图像平面









精准化关键点位置









储存关键点位置信息









计算参数









矫正








导入数据集

/第一步:读取图像信息///
	/*
	定义一个vector容器
	把某一路径下的全部图像全部存入容器中
	*/
	vector<String> Image;
	string Path = "Left";
	glob(Path, Image);

导入关键点世界坐标

vector<Point3f>threewei;
	for (int i = 0; i < CHESSBOARD[1]; i++)
	{
		for (int j = 0; j < CHESSBOARD[0]; j++)
			threewei.push_back(Point3f(i, j, 0));
		
	}
	cout << "/关键点的世界坐标///"<<endl;
	waitKey(2000);

	cout << threewei;

寻找关键点精准化

	第三/四步: 找到关键点在图像上的位置//
	/*
	用Mat类变量表示存在Image里的图像
	变色
	寻找关键点
	精准化
	检测关键点
	储存关键点信息
	*/


	cout << "//正在搜索标定点" << endl;
	Mat ima,imag;
	bool found;
	vector<Point2f>corners;
	vector < vector<Point3f>>threeweidian;
	vector < vector<Point2f>>jiaodian;

	for (int i = 0; i < Image.size(); i++)
	{
		ima = imread(Image[i]);	
		cvtColor(ima, imag, COLOR_BGR2GRAY);	
		found = findChessboardCorners(imag, Size(CHESSBOARD[0], CHESSBOARD[1]), corners,
			CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);
		
		if (found)
		{
			TermCriteria criteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.001);		
			cornerSubPix(imag, corners, cv::Size(11, 11), cv::Size(-1, -1), criteria);	
			drawChessboardCorners(imag, cv::Size(6, 9), corners, found);
			threeweidian.push_back(threewei);
			jiaodian.push_back(corners);
		}
		cv::imshow("Corner Detected Left", imag);
		waitKey(0);
	}

计算内参

	///第五步: 计算相机内外参数 ///


	cout << "开始计算镜头内外参,请等待数分钟……" << endl;
	cv::calibrateCamera(threeweidian,jiaodian, cv::Size(imag.rows, imag.cols), L_cameraMatrix, L_distCoeffs, L_R, L_T);
	cout << "镜头内外参计算完成!" << endl;
		//左摄像头参数输出
		cout << "/// 左摄像头内参 ///" << endl;
		std::cout << "cameraMatrix : " << L_cameraMatrix << std::endl;
		std::cout << "distCoeffs : " << L_distCoeffs << std::endl << endl << endl;
	

总结


程序员灯塔
转载请注明原文链接:https://www.wangt.cc/2021/01/%e7%9b%b8%e6%9c%ba%e6%a0%87%e5%ae%9a/
喜欢 (0)