關於 opencv 訓練LBP聯級分類器的傻瓜式操作
最近需要做一個聯級分類器來定點陣圖像中的目標(用車牌定位來做例子),於是選用opencv的LBP演算法。關於介紹,這篇博文寫的還可以 點選開啟連結 實現的時候查詢其他部落格也遇到了很多問題,我用的是opencv3.2版本,為了以後方便檢視,做下記錄。下面是我使用的過程:
1:首先準備資料集。資料集與SVM類似,分為車牌圖片和非車牌圖片。影象為灰度圖,分別放在pos和neg資料夾下。我用到的資料是pos:328個,neg:1000個。關於數量調整以後還要做測試。
2:copy opencv安裝目錄下的opencv_traincascade.exe和opencv_createsamples.exe
3:生成路徑。首先進入pos資料夾下新建一個get route.bat檔案,檔案內容為:dir /b > pos.txt。雙擊執行後會在pos資料夾下出現pos.txt檔案,然後將pos.txt檔案和get route.bat檔案一同copy出來放到與pos資料夾同級目錄下。接下來開啟pos.txt將不是影象檔案的行刪去,只留下影象檔案所在行(印象中刪去了兩行),並把檔案儲存成此種格式:
後面的130 30即是pos影象檔案的寬和高。然後用同樣的方法生成neg.txt,copy到與之相同資料夾下。不同的是neg.txt中的內容無需做修改,但要刪除非影象檔名所在行(印象中也是兩行)。接下來在同級目錄下新建createsamples.bat。內容為:
opencv_createsamples.exe -info pos.txt -vec pos_LBP.vec -num 328 -w 130 -h 30
pause 雙擊後生成pos_LBP檔案。(注意引數,要和你的引數相匹配)
4:訓練xml。在同一級目錄下新建train.bat。內容為:
opencv_traincascade.exe -data data -vec pos_LBP.vec -bg neg.txt -numPos 328 -numNeg 1000 -featureType LBP -numStages 10 -w 130 -h 30 -minHitRate 0.9999 -maxFalseAlarmRate 0.5 -mode ALL
pause
(同樣注意引數)
在這裡引數就不做過多註釋了。新建data資料夾。最終的問價個數見下圖:
雙擊後執行訓練。完成後可在data下生成xml檔案。
5:測試。用opencv的
CascadeClassifier 和
detectMultiScale測試生成的xml。以下附上測試程式碼:
cv::Mat img, gray;
std::vector<Rect> plate;
CascadeClassifier plate_cascade;
if (!plate_cascade.load("E:\\data\\cascade.xml")){
printf("--(!)Error loading plate\n");
return -1;
};
img = cv::imread("C:\\Users\\Administrator\\Pictures\\chepai\\bug\\plate_detect.jpg");
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
//cv::GaussianBlur(gray, gray, Size(5, 5), 0, 0, 4); //高斯濾波
plate_cascade.detectMultiScale(gray,plate, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(130, 30));
for (size_t i = 0; i < plate.size(); i++){
cv::Point center(plate[i].x + plate[i].width*0.5, plate[i].y + plate[i].height*0.5);
cv::ellipse(img, center, Size(plate[i].width*0.5, plate[i].height*0.5), 0, 0, 360,
Scalar(255, 0, 0), 4, 8, 0);
}
// cv::namedWindow("img", cv::WINDOW_NORMAL);
cv::imshow("img", img);
cv::waitKey(0);
測試結果如圖:
這個分類器還需做進一步調整,如有問題隨時歡迎!