车牌识别大体上需要经历过Sobel定位、颜色定位、SVM对定位来的候选车牌进行评测,给出评分,最后通过提取HOG特征按照训练模型进入ANN识别。
这一章节介绍 定位相关的逻辑代码,其中定位用到 Sobel定位(边缘检测定位), 颜色定位:对应代码里的CarSobelPlateLocation,CarColorPlateLocation;两者定位后得到一些候选的图片,把这些图片送去SVM进行评测,SVM基于HOG提取边缘信息特征,HOG类同之前处理纹理特征的LBP,项目代码在Clion上开发的。
Sobel定位
CarSobelPlateLocation,通过以下的一些步骤进行降噪:
-
高斯模糊
-
灰度化
-
边缘化
-
二值化
-
闭操作
高斯模糊
//预处理 :去噪 让车牌区域更加突出
Mat blur;
//1、高斯模糊(平滑) (1、为了后续操作 2、降噪 )
GaussianBlur(src, blur, Size(5, 5), 0);
//imshow("高斯模糊",blur);
灰度化
Mat gray;
//2、灰度化 去掉颜色 因为它对于我们这里没用 降噪
cvtColor(blur, gray, COLOR_BGR2GRAY);
imshow("灰度", gray);
边缘化
Mat sobel_16;
//3、 边缘检测 让车牌更加突出 在调用时需要以16位来保存数据 在后续操作 以及显示的时候需要转回8位
Sobel(gray, sobel_16, CV_16S, 1, 0);
//转为8位
Mat sobel;
convertScaleAbs(sobel_16, sobel);
imshow("Sobel", sobel);
二值化
//4. 二值化 黑白
Mat shold;
//大律法 最大类间算法
threshold(sobel, shold, 0, 255, THRESH_OTSU + THRESH_BINARY);
imshow("二值", shold);
闭操作
//5、闭操作
// 将相邻的白色区域扩大 连接成一个整体
Mat close;
Mat element = getStructuringElement(MORPH_RECT, Size(17, 3));
morphologyEx(shold, close, MORPH_CLOSE, element);
imshow("闭操作", close);
以上的操作是在处理降噪,第六步初步赛选。
第六步:最大面积、最小面积.宽高逼。
//6、查找轮廓
//获得初步筛选车牌轮廓================================================================
//轮廓检测
vector< vector<Point>> contours;
//查找轮廓 提取最外层的轮廓 将结果变成点序列放入 集合
findContours(close, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
//遍历
vector<RotatedRect> vec_sobel_roi;
for(vector<Point> point:contours){
RotatedRect rotatedRect= minAreaRect(point);
//rectangle(sr