1.1、方案讨论

定位激光在摄像头画面中的位置,最容易想到的方法是通过图像处理找到激光点。因为激光点图像与一般环境图像不一样,通过图像处理可以辨别激光与环境的差异,从而定位激光。首先,这是从人的视角出发的,摄像头看到的并不是这样。摄像头中的感光片可能因为差异看到的是形形色色的画面,可能你看见的激光是一个红色的亮点,而在摄像头画面中它就是一个白色的亮点。

激光照射在不同颜色背景下,所呈的颜色也是不一样的,感光片是通过感知光来储存颜色信息的,然后通过处理把这些光信息反映在屏幕上。在一个背景颜色单一,且深色(比如黑色),那么很容易通过图像处理来找到激光点,在这种环境下,图像处理通过二值化,灰度取阈值,找特征值(白色255等)就可以找到激光点,还有HSV颜色空间来确定激光点,这种方式适应较复杂的环境,因为采用这种方式一定比用RGB方式更准确。上面说的两种方式只要参数调的好,是能达到一定准确度的,但是用在可能出现不同环境下,各颜色,光线,背景等在不断变化的情况下参数也要变,用图像处理精度定位难度是很高的。

当然并不是说图像处理不能实现精准定位,想一想,图像处理如果真能实现完美定位,如果几个相同的激光点同时打在摄像头画面中,那么它应该取识别谁呢?

上面所讲的是基于激光测距应用上的,而不是单纯的进行激光定位的。既然应用在测距应用上,那么在结构固定了的情况下可不可以通过物理的方式来定位激光点呢?

1.2、方案论证

激光测距应用上,我们假设摄像头与激光的位置如下:

                                                                             图1.1 模拟激光测距仪的结构

我们知道了激光距离摄像头的相对位置,我们就知道了摄像头与激光之间的角度(a=arctan(y/x)),无论摄像头画面看多远或者激光打到多远,摄像头与激光之间的相对位置是不会改变的,那么从摄像头画面上来看,激光点将沿着a角度进入摄像头画面,

                                                                 图1.2 激光进入摄像头画面角度

 

首先我们需要知道,摄像头和激光是平行的,那么为什么在摄像头画面中激光越远,激光点里摄像头中心就越近呢?摄像头和激光的距离是固定的,只是越远,摄像头拍摄越广,还是同样大小的屏幕显示画面,就相当于激光点在摄像头画面中被压缩了,被往中心挤了。如下图,d为摄像头与激光实际距离,

                                                       图1.3 激光在不同距离下画面中的呈现方式

如图1.3,随着激光距离越远,摄像头画面越广,而两者之间的实际距离不变,同样显示器显示的情况下,激光点就无限靠近摄像头中心。在摄像头画面中,在激光点打点较近时,如果此时将测距仪器移动,会看到激光在摄像头画面中移动的很明显,当到了一定的距离,激光点就无限靠近画面中心,就是到了某个距离,激光点就和摄像头中心重合了。那么这样的话,就可以知道激光在摄像头中的坐标和激光距离存在这样一个关系:斜率逐渐减小,最后无限趋近于一点的减函数(类似倒函数)。如下图所示:

                                          图1.4 激光在画面中坐标于激光距离的关系

 

上面所讲的是理论论证,下面我们尝试得到图1.4中的函数。摄像头内部有焦距,所有采集到的光信息通过这一点发散再经过物距镜(调整这个可使成像变得清晰,比如相机的自动对焦AF就是调整这个距离)打到感光传感器上,然后成像。那在感光片上成像的物体正是实际物像的缩小版,所以两者具有对应关系。我们取最小关系,假设感光片和屏幕尺寸大小对应。感光传感器上尺寸之比就等于实际物像之比就等于屏幕上的坐标之比。

                                                       图1.4 激光在画面中坐标于激光距离的关系

上图只讨论在x方向的成像,y方向相同(垂直视场角)综上所述,有:

       dx / (L+f)*tan(a)  = px / sx/2

       dy / (L+f)*tan(b)  = py / sy/2                                         

注:dx,dy为激光距离摄像头中心x方向上的实际距离和y方向的实际距离;

       L为测出来的距离

       f为摄像头焦距

       a为摄像头水平视场角

       b为摄像头垂直视场角

       px,py为激光在屏幕中的x,y坐标

       sx,sy为屏幕的像素大小

从上述公式上可以看出,

       Px = dx*sx/((L+f)*tana*2)

其中fa,b,px,py为基本属性,为固定的,所以pxL成倒函数关系,恰好验证了图1.4所示。

       需要注意两点:

1.坐标系是从摄像头中心建立的,不是底角建立的,所以在结构设计时要考虑激光在摄像头的哪一方。还有两者之间的角度决定了激光点从什么方向进入摄像头画面,如1.2所示,这会影响对最小测距距离的影响。

       2.最小测距的确定:首先一般测距模块会给出激光的最小测距距离。还有一种是摄像头刚进入画面时,我们可以把此时的距离当作测距最小距离。当dx/(L+f)*tana等于1时,激光正好进入摄像头画面。如果dx>激光最小测距距离,那么dx为最小测距距离;反之,则最小测距距离为激光最小测距距离。

       讲的比较粗糙,主要是用来备忘,不过很简单,很好理解。嘿嘿~

       源码提供测试方法,要根据实际参数更改和调整。源码中使用的是myantenna L1激光测距模块!!!

      github源码

      

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐