相机标定


前言

一、相机标定是什么?

精度
算法(稳定性)

二、坐标系

在这里插入图片描述

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

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

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

在这里插入图片描述

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

单应性的基本概念

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

总流程

开始
收集图样信息
捕捉标定点
相机参数计算
矫正
结束

程序设计流程

内参
外参
畸变参
收集图像
导入数据集
导入关键点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;
	

总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值