1. 程式人生 > >OPENCV中使用SVM訓練並識別車牌的初步應用

OPENCV中使用SVM訓練並識別車牌的初步應用

    opencv的CvSVM的實現基於libsvm,libsvm是臺灣大學林智仁(Lin Chih-Jen)教授寫的一個世界知名的svm庫(可能算是目前業界使用率最高的一個庫)。svm的perdict方法的輸入是待預測資料的特徵,也稱之為features。在這裡,我們輸入的特徵是影象全部的畫素。由於svm要求輸入的特徵應該是一個向量,而Mat是與影象寬高對應的矩陣,因此在輸入前我們需要使用reshape(1,1)方法把矩陣拉伸成向量。

    在訓練之前要先將待訓練的樣例分類,一類是車牌影象,一類是非車牌圖片,可稱為正樣例和反樣例,分類過程需要很多時間來做。分類好後,就可以把正樣例和反樣例存入程式中,並做好預處理,具體程式碼如下:

<span style="background-color: rgb(240, 240, 240);">//先定義兩個全域性變數</span>
vector<Mat> trainingImages;
vector<int> trainingLabels;
//--------------檔案讀取--------------------
void file_open(string filedir,int flag)
{
	long lf;
	vector<string> files;
	_finddata_t file;
	string path;
	if ((lf = _findfirst(path.assign(filedir).append("\\*").c_str(), &file)) == -1)
	{
		cout << "File Not Found!" << endl;
	}
	else
	{
		while (_findnext(lf, &file) == 0)  //迴圈處理資料夾中所有檔案,但這裡並沒有對子資料夾進行檢查
		{
			if (strcmp(file.name, "..") == 0) continue; //去掉第一個無用檔名".."
			files.push_back(path.assign(filedir).append("\\").append(file.name));  //檔案路徑+檔名儲存到files中
			//cout << file.name << endl;
		}
	}
	_findclose(lf); //關閉檔案查詢
	cout << "the number of file is :" << files.size() << endl;
	int size = files.size();
	if (0 == size)
		cout << "No File Found in train HasPlate!" << endl;
	for (int i = 0; i <files.size(); i++)  // 
	{
		
		Mat img = imread(files[i].c_str());
		//imshow("adad", img);
		Mat line_i = img.reshape(1, 1); //將待訓練圖片一維化(如果是提取圖片特徵進行學習,也需要將特徵進行一維化才能用SVM學習)
		trainingImages.push_back(line_i);   //將一維化的img儲存
		trainingLabels.push_back(flag);    //對應的類別標識
	}
}

這裡flag引數是傳遞過來對應訓練圖片的標識,如果為1則是正樣例,如果為0則為反樣例,在學習時最好將正例和反例分別放在不到資料夾下,且影象尺寸一致。

其實這裡是將影象的所有畫素都做為特徵進行訓練,效果不是很好,實驗結果大概只有80%多的正確率,應該找到更好的特徵進行訓練。

影象讀取好後,在主函式中進行呼叫,程式碼如下:

Mat classes;//儲存所有正負樣例類標
	
	char * filedir = "E:\\data\\plate_detect_svm\\learn\\HasPlate";//正樣例的路徑
	file_open(filedir, 1);  //正樣例檔案讀取
	filedir = "E:\\data\\plate_detect_svm\\learn\\NoPlate";//負樣例路徑
	file_open(filedir, 0);//負樣例檔案讀取
	cout << trainingImages[0].cols << "number"<<trainingImages.size()<< endl;
	Mat trainingData(trainingImages.size(), trainingImages[0].cols, CV_32FC1);//用來儲存所有的正負樣例圖片或特徵
	for (int i = 0; i<trainingImages.size(); i++)//將每個一維的訓練影象儲存至trainingData中
	{
		Mat temp(trainingImages[i]);
		temp.copyTo(trainingData.row(i));//存至trainingData的第i行上
	}
	//trainingData.convertTo(trainingData, CV_32FC1); 
	Mat(trainingLabels).copyTo(classes);
	classes.convertTo(classes, CV_32FC1);<span style="font-family: Arial, Helvetica, sans-serif;">//轉成SVM要求的格式</span>
下面進行SVM引數設定和訓練:
//SVM引數設定,這裡的引數很多,設定的好壞直接影響學習的結果
	CvSVMParams SVM_params;
	SVM_params.svm_type = CvSVM::C_SVC;
	SVM_params.kernel_type = CvSVM::LINEAR; //CvSVM::LINEAR;
	SVM_params.degree = 0;
	SVM_params.gamma = 1;
	SVM_params.coef0 = 0;
	SVM_params.C = 1;
	SVM_params.nu = 0;
	SVM_params.p = 0;
	SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
	//開始訓練(學習)
	CvSVM svm(trainingData, classes, Mat(), Mat(), SVM_params);
	//儲存訓練模型
	FileStorage fsTo("E:/data/svm_plate.xml", FileStorage::WRITE);
	svm.write(*fsTo, "svm");
最後是拿一個圖片進行測試:
void test()
{
	CvSVM svm ;
	svm.clear();
	svm.load("E:\\data\\svm_plate.xml");
	Mat test_img = imread("E:\\data\\plate_detect_svm\\test\\HasPlate\\A03_AAQ839_3.jpg");
	Mat line_test_img = test_img.reshape(1, 1);
	line_test_img.convertTo(line_test_img, CV_32FC1);
	int response = (int)svm.predict(line_test_img);
	if (response == 1)
		cout << "是車牌" << endl;
	else
		cout << "不是車牌" << endl;
		
}

因為要獲得訓練結果的準確識別率不能只用一張一張的影象進行測試,需要用迴圈來呼叫test()函式,並記錄測試的成功率,而要得知成功率就要有事先標定好的測試集來測試,這一步驟不難,想必大家都能實現。



相關推薦

OPENCV使用SVM訓練識別車牌初步應用

    opencv的CvSVM的實現基於libsvm,libsvm是臺灣大學林智仁(Lin Chih-Jen)教授寫的一個世界知名的svm庫(可能算是目前業界使用率最高的一個庫)。svm的perdict方法的輸入是待預測資料的特徵,也稱之為features。在這裡,我們輸

opencv SVM + PCA 人臉識別

這一週一直都在弄人臉識別的東西,這個也可以算是我個人第一個DIY專案,雖然沒有在MFC框架下來實現,但我覺得 SVM + PCA 人臉識別這個東西 最主要的還是演算法 和效果沒有必要一定要在MFC框架下去實現。 從不懂到慢慢明白一些道理,寫這樣一個技術文件無非就是怕以後忘記這樣一個過程。 從這個專案得到的經驗

OpencvSVM樣本訓練、歸類流程及實現

支援向量機(SVM)中最核心的是什麼?個人理解就是前4個字——“支援向量”,一旦在兩類或多累樣本集中定位到某些特定的點作為支援向量,就可以依據這些支援向量計算出來分類超平面,再依據超平面對類別進行歸類劃分就是水到渠成的事了。有必要回顧一下什麼是支援向量機中的支援向量。

TensorFlow使用object detection訓練識別自己的模型

point name mode 添加 asr with pipeline stderr powers 使用object detection訓練並識別自己的模型 1.安裝tensorflow(version>=1.4.0) 2.部署tensorflow models  

opencv——基於SVM的數字識別(3)

前兩篇文章寫了基於兩種特徵提取的SVM數字識別 https://blog.csdn.net/weixin_41721222/article/details/84953788 https://blog.csdn.net/weixin_41721222/article/details/84978

使用object detection訓練識別自己的模型

1.安裝tensorflow(version>=1.4.0) 2.部署tensorflow models   - 在這裡下載   - 解壓並安裝     - 解壓後重命名為models複製到tensorflow/目錄下     - 在linux下       - 進入

OPENCVSVM引數解析--學習1

先來看一下什麼是SVM(支援向量機) SVM是一種訓練機器學習的演算法,可以用於解決分類和迴歸問題,同時還使用了一種稱之為kernel trick(支援向量機的核函式)的技術進行資料的轉換,然後再根據這些轉換資訊,在可能的輸出之中找到一個最優的邊界(超平面)。簡單來說,就是做一些非常複雜的資料轉換工作,然

opencv knn,svm,ann,人臉識別類的使用總結

1、 knn 需要引用的標頭檔案  #include <opencv2/ml/ml.hpp> 用到的opencv類:KNearest   *knn;          得到訓練資料和相應的標記:trainData,將每一個訓練矩陣歸一化為相同的大小,假如為12

opencv——基於SVM的數字識別(2)

上篇文章我們用的特徵是訓練樣本的所有畫素點值,雖然方便但不準確。 這篇文章主要介紹用SVM+HOG特徵對數字進行識別。 詳細請看上篇文章,它們主要區別在於訓練樣本HOG特徵的提取,其他基本一樣,所以我直接附上程式碼。 下面程式碼是opencv3和C++ 可以根據自己需要修改訓練樣本類

opencv——基於SVM的數字識別(1)

關於SVM的原理有很多優秀的視訊和資料,這裡我主要說下利用SVM對數字識別的具體應用 首先,需要有數字的訓練樣本 https://download.csdn.net/download/weixin_41721222/10784418 把0-9資料夾放入模版匹配樣本之中,自己可

OpenCVAdaboost訓練的經驗總結

1 正負樣本比例問題:1:4或者1:5訓練出來的分類器要優於1:1或者1:10 正負樣本比例接近的時候1:1,對負樣本的看中程度很低,在實際的生活中負樣本肯定遠遠多於正樣本 正負樣本比例較大的時候1:10,對負樣本多於看中而忽略了正樣本的統計特性,造成正樣本權重總和很小,當權重小於一定程度的時候可能很大一部分

使用opencvSVM實現車牌區域識別

一、前言 本文僅僅演示使用opencv2.4.6中已經定義好的SVM函式實現對車牌區域正負樣本的訓練,然後使用訓練好的SVM模型對測試樣本進行預測。 二、所使用的正負樣本 首先我將一系列圖片進行影象預處理、分割等一系列步驟,這部分內容可以參看《深入理解opencv 使用計

使用opencvSVM和神經網路實現車牌識別

一、前言 本文參考自《深入理解Opencv 實用計算機視覺專案解析》中的自動車牌識別專案,並對其中的方法理解後,再進行實踐。深刻認識到實際上要完成車牌區域準確定位、車牌區域中字元的準確分割,字元準確識別這一系列步驟的困難。所以最後的識別效果也是有待進一步提高。 二、程式流

opencv應用HOG特徵訓練SVM多分類器的一般框架

1.HOG特徵提取 opencv裡關於HOG特徵的提取是通過函式HOGDescriptor()來完成的,主要有下面4個建構函式: CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStri

OPENCV HOG特徵+SVM分類器行人識別(從訓練識別

          想要訓練分類器,首先要有樣本,正樣本和負樣本,在這裡就是有人的樣本和沒有人的樣本,我的樣本來源於”INRIA Person Dataset”這個網站,連結為點選開啟連結,在下邊有個藍色here(970M),點選下載即可,也可以去我的網盤下載,地址點選開啟

SVM理論到實踐4】基於OpenCvSVM的手寫體數字識別

//由於本人每天時間非常緊張,所以細節寫的不詳細,部落格僅供各位參考,裡面的程式碼都是執行過的,直接可以執行 本章的學習目標:      1)手寫體數字識別資料庫MNIST      2)基於SVM訓練的具體步驟   1)手寫體數字識別資料庫MNIST MNIST(Mixe

opencvSVM圖像分類(二)

proc 文本 c_str lec 源碼 open right tle 特征描述 opencv中的SVM圖像分類(二) 標簽: svm圖像 2015-07-30 08:45 8296人閱讀 評論(35) 收藏 舉報 分類: 【opencv應用】(5) 版

OpenCVseamlessClone的初步實驗

enter mage chrome .cn span text left clone dst seamlessClone是OpenCV中新出現的函數,應該說如果能夠基於較為準確的圖像分割,能夠得到很好的結果。 原始的前景,背景 三種flag下的融合結果 //註意頭

NDk編譯opencv for Android,引用在Unity3d遊戲的一般步驟

ret app sset cpp unity3d 環境 ptr small var 本文使用:Unity3d + opencv + Android Unity3d中可以調用opencv 編譯好的.so 動態庫,在生成Android apk時可以正常運行。 因為An

[實例]ROS使用OpenCV讀取圖像發布圖像消息在rviz顯示

top 選項 == works rate pic echo 內容 color 思路: (1)使用opencv讀取本地圖像 (2)調用cv_bridge::CvImage().toImageMsg()將本地圖像發送給rviz顯示 一、使用opencv讀取本地圖像