安徽师范大学皖江学院 李 颖 晏志维 蔡晓宇
由于多径式微的影响、其他无线设备的干扰以及建筑物的阻挡,GPS在室内的信号覆盖度差,可靠性低,定位效果并不理想。为解决室内无法使用的GPS卫星信号定位这一问题,研究出了许多新技术,之前的算法复杂,需要重新部署专用的参考节点,需要精确的时间同步或精确的测量时间差。该装置室内定位时存在角点检测、光源干扰和图像倾斜问题,文章列举了解决方案。
通过脉冲宽度调制的方法控制白光LED的发光强度,改变3个LED的发光强度对应编码数字信号从而发送信息,通过图像传感器分析每个LED的灰度信息从而解调并处理信息,使用OpenCV进行图像识别处理。下面是对问题解决的具体实施。
考虑一个空间内有3个LED照明布局的情况,合理的特征点检测是关键。
在现实世界中,强干扰有对角点检测时遇到的问题和光源干扰问题。
从图像分析的角度来定义角点可以有以下两种:可以是两个边缘的角点;是邻域内具有两个主方向的特征点。前者往往需要对图像边缘进行编码,需要在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷。
2.1.1 抗干扰方案选择
本设计方案的实现采用了Harris算法放弃了FAST算法,而改进了精度和失误率。
传统算法是通过圆中心点像素与模板圆内其他像素值的比较,统计出与圆中心像素近似的像元数量,当这样的像元数量小于某一个阈值时,就被认为是要检测的角点,该点即为特征点。
针对于上面的定义,我们可以用快速的方法来完成检测,而不用把圆周上的所有点都比较一遍。首先比较上下左右四个点的像素值关系,至少要有3个点的像素灰度值大于I(p)+t或小于 I(p)-t,则 p为候选点,然后再进一步进行完整的判断。为了加快算法的检测速度,可以使用机器学习贪心算法来构建决策树。在考虑程序运行速度时,可以采纳。
改进算法后使用Harris角点检测,它是一种基于图像灰度的一阶导数矩阵检测方法。在像素点的邻域内,导数矩阵描述了数据信号的变化情况。假设在像素点邻域内任意方向上移动块区域,若强度发生了剧烈变化,则变化处的像素点为角点。
可以将Harris图像角点检测算法分为几个步骤:
(1)计算图像I(x,y)在X和Y两个方向的梯度Ix、Iy。
(2)计算图像两个方向梯度的乘积。
(3)使用高斯函数对两个方向梯度的乘积进行高斯加权,生成矩阵M的元素。
(4)计算每个像素的Harris响应值R,并对小于某一阈值t的R置为零。
(5)在设定的邻域内进行非最大值抑制,局部最大值即为角点。
原方案可以快速的检测特征点,在需要考虑运行速度时可以选用,如在高平率的视频序列中进行视觉跟踪。改进算法后检测到的角点可能存在分布不均匀的现象,在纹理丰富的部分会集中大量角点,该方案会增减检测的复杂度,具体的选择应该取决于实际应用中对速度和质量的要求。而此设计是运用在室内环境下,不需要对速度有过高要求,使用改进后的方案即可。
2.1.2 抗干扰光算法实现
以下为使用改进方案情况下3*3窗口角点检测的数学表示:
I(x.y)表示点(x,y)的强度值。对于偏移向量(u,v),偏移向量可以看成某个方向。它的平均强度变化为:
该式用泰勒级数展开,用矩阵形式表示:
中间是一个协方差矩阵,表示所有方向上强度的变化率。这个矩阵的两个特征值给出了最大平均强度变化和垂直方向上的平均强度变化。如果,两个特征值都较高,高于给定的阈值,此点即为角点。
为了避免计算特征值过程复杂耗时,使用以下式子代替:
Det矩阵的行列式,Trace矩阵的迹。经证明,两个特征值都较高时,该式子的值较高。参数k一般设置为0.05~0.5。 Harris角点检测,可以通过极大值抑制改进,即保证角点的强度是局部极大值,移除非局部极大值的角点。本设计使用LED发光只需要判断点光源检测即可。
函数检测部分:
Mat image = imread(“../a.png”);
Mat gray;
cvtColor(image,gray,CV_BGR2GRAY);
Mat cornerStrength;
cornerHarris(gray,cornerStrength,3,3,0.01);
threshold(cornerStrength,cornerStrength,0.001,255,THRESH_BINARY);
从上面检测结果我们可以看到,有很多角点模糊粘连在一起的,我们下面在函数中通过加入非极大值抑制来进一步去除一些粘在一起的角点。
函数检测修改后部分:
Mat image = imread(“a.png”);
Mat gray;
cvtColor(image,gray,CV_BGR2GRAY);
Mat cornerStrength;
cornerHarris(gray,cornerStrength,3,3,0.01);
double maxStrength;
double minStrength;
// 找到图像中的最大、最小值
minMaxLoc(cornerStrength,&minStrength,&maxStrength);
Mat dilated;
Mat locaMax;
dilate(cornerStrength,dilated,Mat());
compare(cornerStrength,dilated,locaMax,CMP_EQ);
Mat cornerMap;
double qualityLevel = 0.01;
double th = qualityLevel*maxStrength;// 阈值计算
threshold(cornerStrength,cornerMap,th,255,THRESH_BINARY);
cornerMap.convertTo(cornerMap,CV_8U);
// 逐点的位运算
bitwise_and(cornerMap,locaMax,cornerMap);
drawCornerOnImage(image,cornerMap);
namedWindow(“result”);
imshow(“result”,image);
waitKey();
本装置使用白光LED,拍摄图片时会发现光发散并不是均匀的,有强烈干扰光,如图1所示,为了把问题的研究简单化,将其理想化为质点点光源,点光源特征为中心明度偏大,而后以发光点为圆心逐渐扩散,其明度是逐级递减的,此时由上述特征,可以区分非点光源(干扰光)与点光源,使用点光源判断:先进行RGB到HSV的色域转换。
在这里为了进一步滤除强烈的自然光干扰,得出图2所示结果,我们采用点光源判断算法。在HSV色域中,V指的是明度,也就是颜色明亮的程度。在实际测试中发现该套算法具有良好的适应能力,在有外界环境光干扰严重,环境复杂的场景下,该算法依旧能够精准判定三个白光LED的位置,同时能够有效区分有用及无用信息,对于分析传感器位置及提高定位精度起到了一定的作用。
图1 干扰光强烈示意图
图2 处理结果后示意图
使用摄像头获取三个白光LED图像时,三角形位置可能会倾斜,如图3,需要进行图像处理,修正三角形位置。
在转换成灰度图像后,使用霍夫变换得到三条直线信息,但是三角形的顶点检测不一,也就是说三个边长并没有完全检测出来,有漏检测的问题。这个实际上是调参数很难弥补的问题,三条边长检测总会存在误差。后来我们发现,虽然顶点没有检测得很好,但是直线方向检测的非常准确,如果我们能作出这三条直线,求出三条直线的交点,我们就可以完美地得到三角形的顶点,由于检测的这个三角形是等腰三角形,又三点距离,很容易判断出来,哪个是三角形的腰,哪个是三角形的底边,由三角形的底边和成像照片的底边所形成的角度,可得出图像需要校正的角度。在这里使用透视变换去处理。通用的变换公式为:
u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中:
重写之前的变换公式可以得到:
所以,已知变换对应的几个点就可以求取变换公式。反之,特定的变换公式也能新的变换后的图片。简单的看一个正方形到四边形的变换:
变换的4组对应点可以表示成:
根据变换公式得到:
定义几个辅助变量:
求解出的变换矩阵就可以将一个正方形变换到四边形。反之,四边形变换到正方形也是一样的。于是,我们通过两次变换:四边形变换到正方形+正方形变换到四边形就可以将任意一个四边形变换到另一个四边形,使得倾斜的图像可以修正,如图4所示。
图3 三角形倾斜示意图
图4 倾斜修复后示意图
测试数据显示比照测试如表1所示:
表1 测试数据显示比照测试
测试数据显示比照测试如表2所示:
表2 测试数据显示比照测试
现今室内定位技术被人们所需求:在消费时商店希望顾客进店消费时可以主动发送一些促销折扣,用户会希望能够直接获取所需要知道的位置,需要导航定位。本次设计在成本上降低了很多,也免去了复杂电路布线的麻烦。目前项目依然存在缺点,在某些情况下,识别点位置精度不高,后续会继续努力,提高精度。
[1]丘维声.线性代数[M].高等教育出版社,2006.
[2]邬弘毅,黄建国.高等数学(工科类)[M].合肥工业大学出版社,2006.
[3]布莱德斯基(Bradski.G.),克勒(Kaehler.A.).学习OpenCV(第1版)[M].清华大学出版社,2009.
[4]塞利斯基(Richard Szeliski).计算机视觉算法与应用[M].清华大学出版社,2012.
[5]Robert Laganiere.OpenCV2计算机视觉编程手册[M].科学出版社,2013.