利用ORB/SIFT + k-means + BOF + GPS 的Building location and recognition项目阶段总结
Tags: ORB SIFT GPS 图像处理 区域划分 k-means opencv
本项目实现的目标功能描述:
用户对建筑物拍摄一张图片,系统可正确识别并实时为用户返回关于该图片中建筑物的相关信息。
下面分两部分对该项目进行介绍:
训练部分:
先用一幅流程图粗略展示一下训练过程:
数据采集
为了后续的实验,我们首先需要进行图片数据集的构建,所以需要一个专门用来采集数据的app,利用这个app,我们对校园的各标志性建筑物进行了360度的拍摄。
app界面如图所示:
采集到的数据如下图所示:
可以看到我们采集到的每个数据元素由两部分组成:一个是照片,一个是关于该照片的相关信息。(两个文件的文件名相同)
数据内容的说明:
* 第一行是该建筑物的名称
* 第二行tilt是手机的倾斜角
* 第三行distance是拍摄者与建筑物的距离
* 第四行height是预设置的,用户拍摄时候,手机离地的高度
* 第五行heading angle是,拍摄时候手机摄像头朝向与正北方的夹角
* 第六七行分别是拍摄者和建筑物的GPS坐标
* 第八行epe是GPS的误差值,单位是m
* 第九行光传感器是拍照瞬间,从光传感器取得值
* 第十,十一行是分别在拍照前后取的加速度传感器的三个轴的数值
注:
1.其中第三行的distance是利用手机的倾角tilt,手机的离地高度height,采用勾股定理公式计算出来的
所以拍摄之前,我们有个步骤是将手机屏幕中间的加号标记对准目标的底部,以获得tilt2.第七行中的建筑物的GPS是利用采集到的手机的GPS,加上计算出来的distance计算得到的,计算函数如下:
private static String ConvertDistanceToLogLat(float distance, double lat1,double lng1, double angle){ String logLat = null; double lon = lng1 + (distance * Math.sin(angle * Math.PI / 180)/1000) / (111 * Math.cos(lat1 * Math.PI / 180));//将距离转换成经度的计算公式 double lat = lat1 + (distance * Math.cos(angle * Math.PI / 180)/1000) / 111;//将距离转换成纬度的计算公式 logLat = + lat + "," + lon ; return logLat; }
3. 并不用专门新建一个.txt文件来记录这个数据,可以将数据附加在图片的最后几个字节中,只是写入txt文件处理起来相对方便,待后期完善
数据筛选过滤
在拍摄过程中,因为手机的不同,或是其它的特殊原因,总会出现一些数据不合格,所以需要对得到的图片和对应的.txt文件进行过滤