3)車牌字元切割
a. 閾值濾波,使用cv_thresh_binary引數通過把白色值變為黑色,黑色值變為白色來實現閾值輸出的反轉,因為需要獲取字元的輪廓,而輪廓的演算法尋找的是白色畫素;
b. 查詢輪廓;
c. 驗證輪廓是否為字元,去除那些規格太小的或者寬高比不正確的區域。字元是45/77的寬高比,允許0.35的誤差。如果乙個區域面積高於80%(就是畫素大於0的超過80%),則認為這個區域是乙個黑色塊,不是字元。
/* charslicer.cpp */
#include #include using namespace std;
using namespace cv;
//包圍字元的矩形篩選
bool chardetection(mat rect)
void platechar(mat srcimg)
} imshow("矩形包圍字元", oriimg);
}
4)車牌字元分類
a. 提取**字元的特徵,建立字元特徵矩陣(水平和垂直累積直方圖、低解析度影象5*5)建立乙個m列的矩陣,矩陣的每一行的每一列都是特徵值水平累加直方圖構造的特徵,垂直方向構造的特徵,低分辨影象構造的特徵);
b.人工神經網路ann分類。
/* charclassification.cpp */
#include #include using namespace std;
using namespace cv;
using namespace ml;
const int horizontal = 1;
const int vertical = 0;
const int numchar = 30;
const char strcharacters[numchar] = ;
//獲得水平或者垂直方向的累加直方圖
mat projectedhistogram(mat img, int flag)
double min, max;
/*void minmaxloc(inputarray src, double* minval, double* maxval=0,
point* minloc=0, point* maxloc=0, inputarray mask=noarray())*/
minmaxloc(phist, &min, &max);//獲得各行的非0畫素數量最大值
if (max > 0) }
//建立特徵矩陣
mat featuremat(mat img, int size)
for (int i = 0; i < hhist.cols; i++)
for (int i = 0; i < lowimg.cols; i++) }
return featmat;
}int trainann(mat trainmat, mat classesmat, int hnn, mat featmat)
} ptrtraindata = traindata::create(trainmat, row_sample, classesdata);
//2.建立ann模型
ptrann = ann_mlp::create();
//3.設定神經網路的層數和神經元數量
/* setlayersizes(inputarray _layer_sizes); */
mat layersizes(1, 3, cv_32sc1);
layersizes.at(0) = trainmat.cols;//輸入層神經元數量
layersizes.at(1) = hnn;//隱層神經元數量
layersizes.at(2) = numchar;//輸出層神經元數量=10個數字+20個字元
ann->setlayersizes(layersizes);
//4.設定啟用函式
/* setactivationfunction(int type, double param1 = 0, double param2 = 0); */
ann->setactivationfunction(ann_mlp::sigmoid_sym, 1, 1);
//5.訓練模型
/*samples - 訓練樣本; layout - 訓練樣本為 「行樣本」 row_sample 或 「列樣本」 col_sample;
result - 對應樣本資料的分類結果*/
/* train(inputarray samples,int layout,inputarray results)*/
ann->train(traindata);
//6.**,結果為行向量
mat result(1, numchar, cv_32fc1);
ann->predict(featmat, result);
//7.獲得輸出矩陣的最大值
point maxloc;
double maxval;
minmaxloc(result, 0, &maxval, 0, &maxloc);
return maxloc.x;
}void annclassifier(mat charimg)
/* main.cpp */
#include #include #include "platedetection.h"
using namespace std;
using namespace cv;
int main(int argc, int ** argv)
所有知識:
1. ostu方法又名最大類間差方法(大津法),通過統計整個影象的直方圖特性來實現全域性閾值t的自動選取,其演算法步驟為:
1) 先計算影象的直方圖,即將影象所有的畫素點按照0~255共256個bin,統計落在每個bin的畫素點數量;
2) 歸一化直方圖,也即將每個bin中畫素點數量除以總的畫素點;
3) i表示分類的閾值,也即乙個灰度級,從0開始迭代;
4) 通過歸一化的直方圖,統計0~i 灰度級的畫素(假設畫素值在此範圍的畫素叫做前景畫素) 所佔整幅影象的比例w0,並統計前景畫素的平均灰度u0;統計i~255灰度級的畫素(假設畫素值在此範圍的畫素叫做背景畫素) 所佔整幅影象的比例w1,並統計背景畫素的平均灰度u1;
5) 計算前景畫素和背景畫素的方差 g = w0*w1*(u0-u1) (u0-u1);
6) i++;轉到4),直到i為256時結束迭代;7)將最大g相應的i值作為影象的全域性閾值t;
2.opencv影象的深度和通道:cv_(s|u|f)c
s = 符號整型 u = 無符號整型 f= 浮點型
cv_8uc1 是指乙個8位無符號整型單通道矩陣
cv_32fc2是指乙個32位浮點型雙通道矩陣
其中,通道表示每個點能存放多少個數,類似於rgb彩色圖中的每個畫素點有三個值,即三通道。中的深度表示每個值由多少位來儲存,是乙個精度問題,一般是8bit(位)的,則深度是8。
1. 《深入理解opencv實用計算機視覺專案解析》第五章 基於svm和神經網路的車牌識別
2. 毛星雲等編著《opencv3程式設計入門》
3. 基於svm和神經網路的的車牌識別 csdn系列部落格:
4. opencv中的神經網路:
5. 影象處理中的仿射變換:
6. 累加直方圖:
7. ostu大津法:
車牌識別與車聯網的關係及車牌識別的應用!
車聯網概念引申自物聯網 internet of things 根據行業背景不同,對車聯網的定義也不盡相同。傳統的車聯網定義是指裝載在車輛上的電子標籤通過無線射頻等識別技術,實現在資訊網路平台上對所有車輛的屬性資訊和靜 動態資訊進行提取和有效利用,並根據不同的功能需求對所有車輛的執行狀態進行有效的監管...
車牌識別之一 車牌定位
車牌識別大概步驟可分為 車牌定位,字元分割,字元識別三個步驟。細分點可以有以下幾個步驟 1 將灰度化與二值化 2 去噪,然後切割成乙個乙個的字元 3 提取每乙個字元的特徵,生成特徵向量或特徵矩陣 4 分類與學習。將特徵向量或特徵矩陣與樣本庫進行比對,挑選出相似的那類樣本,將這類樣本的值作為輸出結果。...
基於EasyPR的車牌識別android實現
easypr4android,基於easypr1.5beta的android實現 更新 新增編譯好的安裝檔案 採用android studio2.3.3大幅簡化ndk開發的配置 特性 1.支援拍照和支援相簿瀏覽識別 2.ndk呼叫opencv 3.從assets讀取並複製檔案 4.採用多執行緒進行識...