openCV 車牌號識別(車牌分類 漢字識別模型 數(shù)字字母識別模型)
機器學習:
- SVM 支持向量機
- ANN人工神經(jīng)網(wǎng)絡
SVM分類工具算法 使用正樣本和負樣本訓練
圖片去噪: 二值化和灰度化
車牌定位過程:
graph LR
A(高斯模糊)-->B(灰度化)
B-->C(邊緣檢測)
C-->D(二值化)
D-->E(閉操作)
E-->F(查找輪廓)
F-->G(篩選)
G-->H(角度尺寸矯正)
H-->I(SVM評測)
I-->J(確定定位)
-
高斯模糊
Mat blur; GaussianBlur(src,blur,size(5,5),0);
-
灰度化
Mat gray; cvtColor(blur,gray,COLOR_BGR2GRAY);
-
邊緣檢測
Mat sobel_16; sobel(gray,sobel_16,CV_165,1,0);
sobel算子僅能對灰度圖像有效果,不能將色彩圖像作為輸入
調(diào)用時以16位保存數(shù)據(jù), 后續(xù)顯示需要轉(zhuǎn)回8位
-
二值化
Mat shold; threshold(sobel,shold,0,255,THRESH_OTSU);
-
閉操作(膨脹腐蝕)
Mat close; Mat element = getStructuringElement(MORPH_RECT,size(17,3)); morphologyEx(shold,close,MORPH_CLOSE,element);
-
查找輪廓
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(src,rotatedRect,boundingRect(),Scalar(255,0,255)); //初步篩選完全不符合的去除 if(verifysizes(rotatedRect)){ vec_sobel_roi,push_back(rotatedRect); } }
RotatedRect 帶旋轉(zhuǎn)角度的矩形 矯正角度傾斜的車牌 找出候選車牌
//矩形矯正(角度判斷长搀,旋轉(zhuǎn)矩形背零,調(diào)整大小) tortuosity(src, vec_color_rects, dst);
機器學習:
- 從候選車牌確定最終車牌 SVM支持向量機的訓練
- 從車牌中識別車牌字符 ANN人工神經(jīng)網(wǎng)絡
提取特征數(shù)據(jù)(常用LBP/HAAR/HOG)
Mat features;
getHogFeatures(svmHog,shold,features);
Mat samples = features.reshape(1,1);//將特征置位1行
//SVM評測 分值越低越有可能是車牌
float score = svm->predict(samples,noArray(),statModel::Flags::RAW_OUTPUT);
SVM訓練必須是CV_32F1(表示數(shù)據(jù)為32位浮點型 單通道)
samples.converTo(samples,CV_32F1);
//ROW_SAMPLE 數(shù)據(jù)以一行保存
Prt<TrainData> trainData = TrainData::create(samples,SampleTypes::ROW_SAMPLE,labels);
創(chuàng)建SVM開始訓練
Prt<SVM> classifier = SVM::create();
classifier->trainAuto(...);
classifier->save(...);
HSV/HSB顏色空間
openCV中 H值:100~140 S和V值:95~255 表示藍色范圍
Mat hsv;
cvtColor(src,hsv,COLOR_BGR2HSV);
//顏色匹配
int channels= hsv.channels();//共有3個通道 H\S\V
int h= hsv.rows;
int w = hsv.cols*channels;
if(hsv.isContinuous()){//判斷是否是一行數(shù)據(jù) 矩陣是否連續(xù)
w*=h;
h=1;
}
for(size_t i=0;i<h;i++){
uchar *p = hsv.ptr<uchar>(i);
for(size)t j=0;j<w;j+=3){
int h = int(p[j]);
int s = int(p[j+1]);
int v = int(p[j+2]);
bool blue = false;
if (h >= 100 && h <= 140 &&
s >= 95 && s <= 255 &&
v >= 95 && v <= 255) {
blue = true;
}
if(blue){//將藍色變白 將其他色變黑
p[j] = 0;
p[j+1]=0;
p[j+2]=255;
}else{
p[j] = 0;
p[j+1]=0;
p[j+2]=0;
}
}
}
字符分割與識別
文字輪廓檢測問題 先找出第2個字母(通過7等分位置定位)
ANN人工神經(jīng)網(wǎng)絡