摄像头测距原理与代码实现

本文介绍了通过3D影像计算物体与摄像头之间距离的方法。基于针孔成像原理,利用焦距、物体高度等参数计算实际距离。文章还探讨了不同情况下的计算公式,并提供了具体的代码实现。

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

外界3D影像投射到摄像头传感器的原理其实就是针孔成像原理。

针孔成像原理,如图所示:

      

f为摄像头的焦距,c为镜头光心

模型的主要依据公式为f/d=h/H,设物体所在平面与相机平面的距离为d,物体实际高度为H,在传感器上的高度为h
根据这个模型,我们就能求出目标物体与我们的摄像头平面的距离。

分两种情况,但是这两种情况的条件都是假设实际物体与摄像机所在平面平行。

一种是当物体主线段过光心的情况,这种情况是最容易计算的, 即 h=sqrt ((横坐标之差*Dx)^2+(纵坐标之差*Dy)^2),  Dx为每个像素的宽度,Dy为每个像素的高度,

关于相机传感的尺寸,参考 http://blog.youkuaiyun.com/u011572037/article/details/78236795

  另一种就是物体主线段不过光心的情况,一般情况下都属于这个情况。

不废话,直接上程序,焦距和图像中心坐标都是相机标定的出的结果,个人推荐matlab的标定程序,比较人性化,而且准确

int width=640,height=480;
double focalLength=4.2;//焦距(单位:mm)
/////////////////////////////////////////////////////////////////
//求相机到线段的距离,注意相机平面必须与线段平面平行
//所用到的主要公式f/d=h/H
/////////////////////////////////////////////////////////////////
int  coordinate(Point First,Point Second,Point centre,Point2d Sensor_Size,int H)
{
	First=Point(1,1);
	Second=Point(1,300);
	//先求出主光轴到两点连线的垂足的距离(实际尺寸)
	double h=0;//h为传感器上的高度
	//求垂足的坐标
	int  Distance_To_Centre = 0;//返回值(实际距离)
	Point retVal;  
        double dx = abs(First.x - Second.x);  
        double dy = abs(First.y - Second.y);  

        double u = (centre.x - First.x)*(First.x - Second.x) +  
        (centre.y - First.y)*(First.y - Second.y);  
        u = u/((dx*dx)+(dy*dy));  
  
        retVal.x = abs(First.x + u*dx);  
        retVal.y = abs(First.y + u*dy);  
  
	double centreToretVal=0;//主轴到垂足在图像上的距离
	centreToretVal=sqrt((centre.x-retVal.x)*Sensor_Size.x/width*(centre.x-retVal.x)*Sensor_Size.x/width+\
		(centre.y-retVal.y)*Sensor_Size.y/height*(centre.y-retVal.y)*Sensor_Size.y/height);

	int d=0;//与线段所在平面的距离
	h=sqrt((First.x-Second.x)*Sensor_Size.x/width*(First.x-Second.x)*Sensor_Size.x/width+\
		(First.y-Second.y)*Sensor_Size.y/height*(First.y-Second.y)*Sensor_Size.y/height);
	d=focalLength*H/h;

	double arctan=0;//实际垂足与光心的连线与主光轴的倾斜夹角
	arctan=atan((centreToretVal/focalLength));
	
	
	if(acos(arctan)!=0)
	Distance_To_Centre=d/cos(arctan);//根据倾斜角度求出实际距离

	return Distance_To_Centre;
}


                                          


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值