opencv双目视觉特征匹配点三角测量得到三维坐标

本文介绍了一种将双目相机捕获的图像转换为三维坐标的算法。通过三角测量方法,利用双目相机的内参和外参,计算出场景中各点的三维坐标。同时,提供了另一种基于cvPerspectiveTransform函数的方法实现,适用于计算机视觉和立体视觉领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void StereoTo3D(vector<Point2f> ptsL, vector<Point2f> ptsR, vector<Point3f> &pts3D, Mat Q,Mat T)
{
	//1三角测量
	if (ptsL.size() != ptsR.size())
	{
		cout << "匹配点数量出现错误" << endl;
		return;
	}
	float cx = -Q.at<double>(0, 3);
	float cy = -Q.at<double>(1, 3);
	float f = Q.at<double>(2, 3);

	float B = sqrt(T.at<double>(0,0)* T.at<double>(0, 0) + T.at<double>(1, 0) * T.at<double>(1, 0) + T.at<double>(2, 0) * T.at<double>(2, 0));
	pts3D.resize(ptsL.size());
	for (int i = 0; i < ptsL.size(); i++)
	{
		pts3D[i].x = (ptsL[i].x - cx) * B / (ptsL[i].x - ptsR[i].x);
		pts3D[i].y = (ptsL[i].y - cy) * B / (ptsL[i].x - ptsR[i].x);
		pts3D[i].z = f         * B / (ptsL[i].x - ptsR[i].x);
	}

	//2基于cvPerspectiveTransform函数
	//CvMat *src = cvCreateMat(1, 1, CV_32FC3);//待变换点  
	//CvMat *dst = cvCreateMat(1, 1, CV_32FC3);//变换后点  
	//CvMat *perMat = cvCreateMat(4, 4, CV_32FC1);//透视投影变换矩阵  
	//*perMat = Q;
	//pts3D.resize(ptsL.size());
	//for (int i = 0; i < ptsL.size(); i++)
	//{
	//	cvZero(src);
	//	cvZero(dst);
	//	for (int j = 0; j < 3; j++)
	//	{
	//		float *p = (float*)cvPtr2D(src, 0, 0);
	//		*p++ = ptsL[i].x;
	//		*p++ = ptsL[i].y;
	//		*p = ptsL[i].x - ptsR[i].x;
	//	}
	//	cvPerspectiveTransform(src, dst, perMat);
	//	float *pp = (float*)cvPtr2D(dst, 0, 0);
	//	pts3D[i].x = *pp++;
	//	pts3D[i].y = *pp++;
	//	pts3D[i].z = *pp;
	//}
}

将双目标定校正后的参数导入即可。测试可行

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大臉喵愛吃魚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值