基于OpenCV检测影像中的车辆

关注微信公众号:GISGO,获得更多GIS技术

近段时间一直在研究机器学习,主要学习的是数据挖掘和自然语言处理,期望能将所学与GIS结合起来。同时团队有成员在研究视觉,平时听到最多的是他们在讨论OpenCV这个库,通过他们的口也了解到这个库在图像处理领域十分强大。虽然OpenCV和我的核心工作没有关联,但是热衷于技术的我实在抵挡不了新鲜事的诱惑。

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac
OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++
类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。《百度百科》

OpenCV安装后,自带预训练好的人脸检测模型,通过简单的调用就能高效快速地检测人脸。
基于OpenCV检测影像中的车辆
基于OpenCV检测影像中的车辆
OpenCV通过提取样本图像Haar特征,采用Adaboost算法训练分类器。Haar特征和Adaboost的原理这里不多做介绍,大家自行搜索引擎。

既然OpenCV能高效识别人脸,是否也可以识别影像上的地物呢?

以下是我设计的技术路线,仅供参考

基于OpenCV检测影像中的车辆

1、样本采集

从谷歌地球上下载分辨率*别的影像,采集车辆为正样本,不包含车辆的区域为负样本。最后正样本要统计尺寸并转为灰度图。样本尽量多,负样本要多于正样本。
正样本
基于OpenCV检测影像中的车辆

负样本
基于OpenCV检测影像中的车辆
2、准备训练数据

OpenCV安装好后,在安装目录有训练级联分类器的工具,通过CMD可以直接调用。
基于OpenCV检测影像中的车辆

opencv_createsamples 用来准备训练用的正样本数据和测试数据。opencv_createsamples 能够生成能被opencv_haartraining 和 opencv_traincascade 程序支持的正样本数据。它的输出为以 *.vec为扩展名的文件,该文件以二进制方式存储图像

3、训练模型

OpenCV提供了两个程序可以训练自己的级联分类器opencv_haartraining与opencv_traincascade。opencv_traincascade是一个新程序,使用OpenCV2.x API 以C++编写。这二者主要的区别是opencv_traincascade支持Haar和 LBP(Local Binary Patterns)两种特征,并易于增加其他的特征。
基于OpenCV检测影像中的车辆

4、测试模型

利用CasscadeClassifier调用训练好的模型,然后通过detectMultiScale去检测图形,具体参数可根据实际情况调节。

参数1:image–待检测图片,一般为灰度图像加快检测速度;

参数2:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;

参数3:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上;

参数4:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;

参数6、5:minSize和maxSize用来限制得到的目标区域的范围
基于OpenCV检测影像中的车辆

5、结果展示

基于OpenCV检测影像中的车辆
基于OpenCV检测影像中的车辆
基于OpenCV检测影像中的车辆
基于OpenCV检测影像中的车辆

评价

首先可以肯定的是,可以使用OpenCV来进行影像中车辆的检测。利用Haar特征的车辆检测效果也比较好;通过Adaboost算法训练用于地物识别的分类器,算法效率比较高,自动化程度也很高;并且对于同一种遥感数据中的同一种地物可使用已经训练好的同一个分类器进行识别,分类器具有一定的普适性。但是,从结果也可以看到在复杂地形下识别率不高,阴影处的车辆识别率不高。并且受Adaboost算法特征的影响,错误样本对结果准确率影响很大,所以要求样本质量较高。

基于OpenCV检测影像中的车辆

快,关注这个公众号,一起涨姿势~