1. 程式人生 > >opencv的svm學習_字元識別

opencv的svm學習_字元識別

簡介

  這是基於svm實現字元識別,不過只是個大概模板,需要能夠準確識別,需要的訓練樣本太多,沒去收集。


程式碼講解


具體程式碼

#include <opencv2/core/core.hpp>                                                                                                   
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
#include <stdio.h>
#include <opencv2/ml/ml.hpp>
 
using namespace cv;
 
#define match_all 10
#define match_detect 10
#define pic_size 512
 
int main(int argc, char* argv[]){
	const char *match_pic[match_all] = {
		"rightPic/0.bmp", "rightPic/1.bmp", "rightPic/2.bmp", "rightPic/3.bmp", "rightPic/4.bmp",
		"rightPic/5.bmp", "errorPic/6.bmp", "errorPic/7.bmp", "errorPic/8.bmp", "errorPic/9.bmp",
	};
	int i, j, k;
 
	float labels[10]={1, 1, 1, 1, 1, 1, -1, -1, -1, -1};
	Mat labelsMat(10, 1, CV_32FC1, labels);
 
 
	float trainingData[10][pic_size];
 
	for(i=0; i<match_detect; i++){
		cv::Mat mat1 = cv::imread(match_pic[i], 0);
		uchar* ptr = mat1.ptr(0);
		int length = mat1.rows * mat1.cols;
 
		for(j=0; j<length; j++){
			trainingData[i][j] = (float)ptr[j];
		}	
	}
	Mat trainingDataMat(10, pic_size, CV_32FC1, trainingData);
 
	// Set up SVM's parameters
	CvSVMParams params;
	params.svm_type    = CvSVM::C_SVC;
	params.C            = 0.1; 
	params.kernel_type = CvSVM::LINEAR;
	params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
 
	// Train the SVM
	CvSVM SVM;
	SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
 
	cv::Mat mat2 = cv::imread(argv[1], 0);
	uchar* ptr2 = mat2.ptr(0);
	float testData[pic_size];
	for(k=0; k<pic_size; k++){
		testData[k] = (float)ptr2[k];
	}
	cv::Mat mat3(1, pic_size, CV_32FC1, testData);
	float response = SVM.predict(mat3);
	printf("response:%f\n", response);
	cv::imshow("SVM Simple Example", mat2);
 
	waitKey(0);
}


建立訓練樣本

const char *match_pic[match_all] = {
		"rightPic/0.bmp", "rightPic/1.bmp", "rightPic/2.bmp", "rightPic/3.bmp", "rightPic/4.bmp",
		"rightPic/5.bmp", "errorPic/6.bmp", "errorPic/7.bmp", "errorPic/8.bmp", "errorPic/9.bmp",
	};
	int i, j, k;
 
	float labels[10]={1, 1, 1, 1, 1, 1, -1, -1, -1, -1};
	Mat labelsMat(10, 1, CV_32FC1, labels);
 
 
	float trainingData[10][pic_size];
 
	for(i=0; i<match_detect; i++){
		cv::Mat mat1 = cv::imread(match_pic[i], 0);
		uchar* ptr = mat1.ptr(0);
		int length = mat1.rows * mat1.cols;
 
		for(j=0; j<length; j++){
			trainingData[i][j] = (float)ptr[j];
		}	
	}
	Mat trainingDataMat(10, pic_size, CV_32FC1, trainingData);

  首先是定義使用了10個訓練樣本,在labels中,利用1和-1,將前6個分為一類,後四個分為一類。接著match_pic定義了訓練樣本的路徑,所謂的訓練樣本也就是
10張圖片,前面6張是字元0的圖片,後面4張是其他1-9的圖片。這樣通過大量訓練之後,就能在這個svm中將0從0-9的字元中識別出來。但是訓練樣本必須大。。不能
如本例這般小。
  分配一個結構儲存訓練樣本資料:trainingData[10][pic_size];將10張16X32的訓練圖片都匯入到該陣列中。在本例中,因為訓練的樣本圖片都不大,所以沒有取
圖片的特徵值,而是整個圖片匯入訓練。


訓練支援向量機

  // Set up SVM's parameters
	CvSVMParams params;
	params.svm_type    = CvSVM::C_SVC;
	params.C            = 0.1; 
	params.kernel_type = CvSVM::LINEAR;
	params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
 
	// Train the SVM
	CvSVM SVM;
	SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

  也是用函式SVM.train用之前填充的trainingDataMat進行訓練。


字元識別

 cv::Mat mat2 = cv::imread(argv[1], 0);
	uchar* ptr2 = mat2.ptr(0);
	float testData[pic_size];
	for(k=0; k<pic_size; k++){
		testData[k] = (float)ptr2[k];
	}
	cv::Mat mat3(1, pic_size, CV_32FC1, testData);
	float response = SVM.predict(mat3);
	printf("response:%f\n", response);

  分配mat2來接收,我們需要識別的圖片:argv[1],然後一樣的使用SVM.predict進行識別。最後如果response 返回為1,表示需要識別的圖片是字元0,否則就是0-9
的其他圖片。

相關推薦

opencv的svm學習_字元識別

簡介   這是基於svm實現字元識別,不過只是個大概模板,需要能夠準確識別,需要的訓練樣本太多,沒去收集。 程式碼講解 具體程式碼 #include <opencv2/core/core.hpp>

Opencv Python版學習筆記 字元識別-分類器(SVM,KNearest,RTrees,Boost,MLP)

Opencv提供了幾種分類器,例程裡通過字元識別來進行說明的 1、支援向量機(SVM):給定訓練樣本,支援向量機建立一個超平面作為決策平面,使得正例和反例之間的隔離邊緣被最大化。 函式原型:訓練原型 cv2.SVM.train(trainData, responses[, varIdx[,

06《基於卷積神經網路LeNet-5的車牌字元識別研究》學習總結

一、本篇介紹 二、本文主要內容(知識點) 1、概要 2、卷積神經網路介紹 1.卷積層 2.次抽樣層 3、LeNet-5介

機器學習之用Hog+Svm人臉檢測、交通標誌和字元識別等(初學者)

首先宣告,這裡主要用svm進行一個簡單的二分類,最後得到結果,我們把正樣本設為1,負樣本設為0。 這裡只是一個簡單的介紹,後面會有相關詳細介紹的連結,個人認為比較好的,對我們比較有幫助的連結,有興趣的可以去看看。當然,本文對初學者有點幫助,也特別歡迎大神來拍!

吳恩達機器學習筆記 —— 19 應用舉例:照片OCR(光學字元識別

本章講述的是一個複雜的機器學習系統,通過它可以看到機器學習的系統是如何組裝起來的;另外也說明了一個複雜的流水線系統如何定位瓶頸與分配資源。 OCR的問題就是根據圖片識別圖片中的文字: 這種OCR識別的問題可以理解成三個步驟: 文字檢測 字元切分 字元識別 文字檢測 文字的檢測可以用行人的檢測來做

『TensorFlow』遷移學習_他山之石,可以攻玉

不同 target lis 理解 pla 之前 photo 多說 esc 目的: 使用google已經訓練好的模型,將最後的全連接層修改為我們自己的全連接層,將原有的1000分類分類器修改為我們自己的5分類分類器,利用原有模型的特征提取能力實現我們自己數據對應模型的快速訓練

機器學習_路徑

ren ans com ech www cfa tail http dev 1、http://blog.csdn.net/baihuaxiu123/article/details/52464510 2、http://www.cnblogs.com/hudongni1/p/5

H5學習_番外篇_PHP數據庫操作

資源 new views 遠程 -s 好的 路徑 print filename 1. 文件操作 1.1 打開關閉文件 fopen() resource fopen ( string filename, string mode [, boo

PHP學習_開發環境搭建_AapcheHTTPD的安裝

可選 src ont pch 分享 php開發 開發環境 -i 端口 記住一句話 PHP是ApacheHTTPD的一個模塊 PHP是運行在服務器端的,靠的就是ApacheHTTPD去解析並加載PHP。 什麽都不說,直接上一張圖 學習這個PHP

深度學習 vs 機器學習 vs 模式識別

com plain pat 實現 list 人類 編程 www put 整理:深度學習 vs 機器學習 vs 模式識別 發表於2015-03-24 22:58| 78882次閱讀| 來源個人博客| 41 條評論| 作者Tomasz Malisiewicz

redis源碼學習_鏈表

str release ota art 鏈表結構 不能 clas 插入 選擇 redis的鏈表是雙向鏈表,該鏈表不帶頭結點,具體如下: 主要總結一下adlist.c和adlist.h裏面的關鍵結構體和函數。 鏈表節點結構如下: 1 /* 2 * 雙端鏈表節點 3

redis源碼學習_整數集合

www. 是否 conf blob idt 成功 .html argc top redis裏面的整數集合保存的都是整數,有int_16、int_32和int_64這3種類型,和C++中的set容器差不多。 同時具備如下特點: 1、set裏面的數不重復,均為唯一。 2、set

nginx源碼學習_數據結構(ngx_int_t)

usr tdi col end conf 學習 unsigned div 數據 nginx中關於整型的數據結構位於src/core/ngx_config.h中 結構比較簡單,就是一個typedef的操作,具體如下: 1 typedef intptr_t ng

『TensorFlow』遷移學習_他山之石,可以攻玉_V2

tsl jpeg 西遊記 snr lib 成了 exist ads 感覺 『TensorFlow』遷移學習_他山之石,可以攻玉 絮絮叨叨 開學以來課業繁重(雖然也不怎麽認真聽講...)一直沒怎麽閑著,一直沒寫什麽長的代碼,正巧好幾件事趕在一塊了:導師催著我把超新星檢測的神經

『Re』知識工程作業_主體識別

lib cname line lin 兩種 list loss pytho mat 作業要求 環境路徑 類似於這樣的,一共50篇文檔, 均為中文文檔,是法院判決書的合集。 程序 程序如下,我完全使用正則表達式來實現功能, import re import glob

java基礎學習_面向對象(上)01_day07總結

java程序 new 類名 定義和使用 轉換 技術 round 類與對象 fcc ================================================================================================

java基礎學習_面向對象(上)02_day07總結

ron 分享 方式 復用性 消失 總結 一個 alt 引用 ===========================================================================================================

【OCR技術系列之四】基於深度學習的文字識別(3755個漢字)

架構 indices 編碼 協調器 論文 準備 分享 深度 ast 上一篇提到文字數據集的合成,現在我們手頭上已經得到了3755個漢字(一級字庫)的印刷體圖像數據集,我們可以利用它們進行接下來的3755個漢字的識別系統的搭建。用深度學習做文字識別,用的網絡當然是CNN,那具

java基礎學習_面向對象(上)03_day08總結

幫助 img static -- 調用構造 它的 png 利用 一個 ======================================================================================================

java基礎學習_面向對象(下)01_day08總結

存儲空間 post 通過 設計 有一個 數列 兩個 作用 取出 =========================================================================================================