问题内容:路面箭头检测与识别(该部分主要介绍基于SVM的分类,也就是识别,检测问题暂不谈)
问题背景:路面箭头识别在无人车中有着重要的作用:
1.车道线等重要信息的检测,需要排除路面箭头的干扰;
2.需要根据路面箭头的指示,完成下一步动作
问题描述:为了简化这个问题,重点描述基于OpenCV的SVM路面箭头分类,我们将预先检测到的待分类 路面箭头给出如下,样本均从俯视图(逆透视)中检测获得:
图片1-11中包括:1-3、10为虚线的误检、4-5为直右箭头、6-9为误检、11为倒着的直左箭头
问题难点(本文中未解决):为何找到一个合适的特征,来解决箭头的旋转不变、尺度不变问题
作者在有限的时间中尝试过Hu矩特征、SIFT特征,效果都不是很理想,具体情况表现为:
Hu矩特征:虽然有旋转不变特性,但是将信息压缩太严重,最后得到的仅是一个七维特征,放入SVM中训练效果很差;
SIFT特征:其也具有尺度和旋转不变性,且对光照不均等现象具有抑制作用,但是作者尝试发现,样本和测试集的特征点检测较少,无法聚类得到定长的特征算子,故无法进行SVM分类
本文采用方法:考虑到路面箭头的形式、形状甚至大小比较单一,仅仅是位置、角度不同,故可以放入较多的模板来反映同一标志不同角度的形态特征,最后将整图信息压缩到固定大小作为特征算子输入SVM中,仍可以取得不错的效果。
样本准备:
不同样式、相同样式不同角度以及负样本,本文采用374个样本。
代码操作:
首先在工程的路径下放入样本集以及测试集,如下图所示sample和test文件夹
上代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <opencv2\opencv.hpp>
#include "opencv2/core/core.hpp"
#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include <iostream>
#include <time.h>
#include "MomentFeature.h"
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
using namespace cv;
using namespace std;
#define trainnum 374//374
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
/*
//标签值,角度未合并
float label[trainnum] =
{
1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,
8,8,8,8,8,8,8,8,8,8,
9,9,9,9,9,9,9,9,9,9,
10,10,10,10,10,10,10,10,10,10,
11,11,11,11,11,11,11,11,