-
.
..
如何用摄像头来测距
.robotsky.
来源:
csdn
时间:
2008-07-26
评论
0
条
(
访问论坛
)
RobotSky
恭候您的投稿
>><
/p>
最近一直忙着找工作,
blog
都长草了,今天把以前作的一个东西放上来充充门面吧。记得
在哪看到
过老外做的这个东西,
觉得很好玩,
就自己也做了一个。
在摄像头下面固定一个激
光笔,就构成了这个简易的测距装置。看一下
图吧。
原
理
假设激光束是与摄像头的光轴完全平行,
< br>激光束的中心落点在在摄像头的视域中是最亮的
点。
激光
束照射到摄像头视域中的跟踪目标上,
那么摄像头可以捕捉到这个点,
< br>通过简单的
.
s
..
.
..
图
像处理的方法,可以在这侦图像中找到激光束照射形成的最亮点,同时可以计算出
Y
p>
轴
上方向上从落点到图像中心的象素的个数。
这个落点越接近图像的中心,
被测物体距离机器
人就越远。由
下图图可以计算距离
D
:
(
1
)
等式中
h
是一个常量,是摄像头与激光发射器之间的垂直距离,可以直接测量获得。
θ
可通过下式计算:
θ=Num*Rop+Offset
(
2
)
其中:
Num
是从图像中心到落点的像
素个数
Rop
是每个像素的弧度值
Offset
是弧度误差
合并以上等式可以得到:
(
3
)
.
s
..
.
..
Num
可以从图像上计算得到。
Rop
和
O
ffset
需要通过实验计算获得。首先测量出
D
的准
确值,然后根据等式(
1
)可以计算出准确的
θ
,根据等式(
2
)可到只含有参数
Rop
和
Offset
的方程。在不同的距离多次测量
D
的准确值计算
θ
,求解方程组可以求出
Rop
和
Offset
。这里
Rop
=
0.0030
354
,
Offset
=
0.056514344
。
程
序
头文件:
class LaserRange
{
public:
struct RangeResult *
GetRange(IplImage * imgRange,IplImage * imgDst);
LaserRange();
virtual
~LaserRange();
private:
unsigned
int maxW;
unsigned
int
maxH;
unsigned
int MaxPixel;
RangeResult * strctResult;
.
s
..
.
..
// Values used for calculating range
from captured image data
const double gain;
// Gain Constant
used for converting pixel offset to angle in
radians
const double
offset;
// Offset
Constant
const double h_cm;
// Distance between center of camera
and laser
unsigned int pixels_from_center;
// Brightest pixel location from center
void
Preprocess(void * img,IplImage * imgTemp);
};
cpp
文件:
LaserRange::LaserRange():ga
in(0.0030354),offset(0),h_cm(4.542)
{
maxW=0;
maxH=0;
MaxPixel=0;
pixels_from_center=0;
//
Brightest pixel location from center
strctResult=new
RangeResult;
strctResult->maxCol=0;
strctResult->maxRow=0;
strctResult->maxPixel=0;
strctResult->Range=0.0;
}
LaserRange::~LaserRange()
{
if(NULL!=strctResult) delete
strctResult;
}
struct RangeResult *
LaserRange::GetRange(IplImage * imgRange,IplImage
*
imgDst)
{
if(NULL==imgRange) return
strctResult;
Preprocess(imgRange,imgDst);
pixels_from_center =
abs(120-maxH);
// Calculate
range in cm based on bright pixel location, and
setup specific
constants
strctResult->Range=
h_cm/tan(pixels_from_center * gain + offset);
strct
Result->PixfromCent=pixels_from_center;
strctResult->maxCol=maxW;
strctResult->maxRow=maxH;
.
s
..
-
-
-
-
-
-
-
-
-
上一篇:描写雷电的好词好句摘抄
下一篇:康模数尔软件技术上海有限公司