日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV手写数字字符识别(基于k近邻算法)

發(fā)布時(shí)間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV手写数字字符识别(基于k近邻算法) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

摘要

本程序主要參照論文,《基于OpenCV的脫機(jī)手寫(xiě)字符識(shí)別技術(shù)》實(shí)現(xiàn)了,對(duì)于手寫(xiě)阿拉伯?dāng)?shù)字的識(shí)別工作。識(shí)別工作分為三大步驟:預(yù)處理,特征提取,分類(lèi)識(shí)別。預(yù)處理過(guò)程主要找到圖像的ROI部分子圖像并進(jìn)行大小的歸一化處理,特征提取將圖像轉(zhuǎn)化為特征向量,分類(lèi)識(shí)別采用k-近鄰分類(lèi)方法進(jìn)行分類(lèi)處理,最后根據(jù)分類(lèi)結(jié)果完成識(shí)別工作。

程序采用Microsoft Visual Studio 2010與OpenCV2.4.4在Windows 7-64位旗艦版系統(tǒng)下開(kāi)發(fā)完成。并在Windows xp-32位系統(tǒng)下測(cè)試可用。

主流程圖

?

細(xì)化流程圖:

?

?

?

1.?? 預(yù)處理

預(yù)處理的過(guò)程就是找到圖像的ROI區(qū)域的過(guò)程,如下圖所示:

?

首先找到數(shù)字的邊界框,然后大小歸一化數(shù)字圖片,主要流程如下圖所示:

?

?

?

主要代碼:

IplImagepreprocessing(IplImage*imgSrc,intnew_width,intnew_height)

{

?????? IplImage* result;

?????? IplImage* scaledResult;

?

?????? CvMat data;

?????? CvMat dataA;

??????CvRectbb;//bounding box

??????CvRectbba;//boundinb box maintain aspect ratio

??????

??????//Find bounding box找到邊界框

?????? bb=findBB(imgSrc);

?????? cvGetSubRect(imgSrc, &data,cvRect(bb.x,bb.y,bb.width,bb.height));

?????? int size=(bb.width>bb.height)?bb.width:bb.height;

?????? result=cvCreateImage( cvSize( size, size ), 8, 1 );

?????? cvSet(result,CV_RGB(255,255,255),NULL);

??????//圖像放中間,大小歸一化

?????? int x=(int)floor((float)(size-bb.width)/2.0f);

?????? int y=(int)floor((float)(size-bb.height)/2.0f);

?????? cvGetSubRect(result, &dataA,cvRect(x,y,bb.width,bb.height));

?????? cvCopy(&data, &dataA,NULL);

??????//Scale result

?????? scaledResult=cvCreateImage( cvSize( new_width, new_height ), 8, 1 );

?????? cvResize(result, scaledResult, CV_INTER_NN);

??????

??????//Return processed data

??????return *scaledResult;//直接返回處理后的圖片

??????

}

?

?

2.?? 特征提取

在拿到ROI圖像減少了信息量之后,就可以直接用圖片作為向量矩陣作為輸入:

voidbasicOCR::getData()

{

?????? IplImage* src_image;

?????? IplImage prs_image;

?????? CvMat row,data;

?????? char file[255];

?????? int i,j;

?????? for(i =0; i<classes;i++)//總共10個(gè)數(shù)字

?????? {

?????????????for(j = 0; j<train_samples;j++)//每個(gè)數(shù)字50個(gè)樣本

????????????? {

????????????????????

????????????????????//加載所有的樣本pbm格式圖像作為訓(xùn)練

????????????????????if(j<10)

???????????????????????????sprintf(file,"%s%d/%d0%d.pbm",file_path,i,i , j);

????????????????????else

???????????????????????????sprintf(file,"%s%d/%d%d.pbm",file_path,i,i , j);

????????????????????src_image =cvLoadImage(file,0);

????????????????????if(!src_image)

???????????????????? {

???????????????????????????printf("Error: Cant load image %s\n",file);

???????????????????????????//exit(-1);

???????????????????? }

????????????????????//process file

????????????????????prs_image =preprocessing(src_image,size,size);

????????????????????//生成訓(xùn)練矩陣,每個(gè)圖像作為一個(gè)向量

????????????????????cvGetRow(trainClasses, &row,i*train_samples +j);

????????????????????cvSet(&row,cvRealScalar(i));

????????????????????//Set data

????????????????????cvGetRow(trainData, &row,i*train_samples +j);

?

????????????????????IplImage*img = cvCreateImage(cvSize( size, size ),

IPL_DEPTH_32F, 1 );

????????????????????//轉(zhuǎn)換換 8 bits image to 32位浮點(diǎn)數(shù)圖片取值區(qū)間為[0,1]

????????????????????//scale?=?0.0039215?=?1/255;?

????????????????????cvConvertScale(&prs_image,img, 0.0039215, 0);

?

????????????????????cvGetSubRect(img, &data,cvRect(0,0,size,size));

????????????????????

????????????????????CvMatrow_header, *row1;

????????????????????//convert data matrix sizexsize to vecor

????????????????????row1 =cvReshape( &data, &row_header, 0, 1 );

????????????????????cvCopy(row1, &row,NULL);

????????????? }

?????? }

}

?

?

3.?? 分類(lèi)識(shí)別

識(shí)別方法采用knn近鄰分類(lèi)法。這個(gè)算法首先貯藏所有的訓(xùn)練樣本,然后通過(guò)分析(包括選舉,計(jì)算加權(quán)和等方式)一個(gè)新樣本周?chē)鶮個(gè)最近鄰以給出該樣本的相應(yīng)值。這種方法有時(shí)候被稱(chēng)作“基于樣本的學(xué)習(xí)”,即為了預(yù)測(cè),我們對(duì)于給定的輸入搜索最近的已知其相應(yīng)的特征向量。

K最近鄰(k-Nearest Neighbor,KNN)分類(lèi)算法,是一個(gè)理論上比較成熟的方法,也是最簡(jiǎn)單的機(jī)器學(xué)習(xí)算法之一。該方法的思路是:如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類(lèi)別,則該樣本也屬于這個(gè)類(lèi)別。KNN算法中,所選擇的鄰居都是已經(jīng)正確分類(lèi)的對(duì)象。該方法在定類(lèi)決策上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類(lèi)別來(lái)決定待分樣本所屬的類(lèi)別。 KNN方法雖然從原理上也依賴(lài)于極限定理,但在類(lèi)別決策時(shí),只與極少量的相鄰樣本有關(guān)。由于KNN方法主要靠周?chē)邢薜泥徑臉颖?#xff0c;而不是靠判別類(lèi)域的方法來(lái)確定所屬類(lèi)別的,因此對(duì)于類(lèi)域的交叉或重疊較多的待分樣本集來(lái)說(shuō),KNN方法較其他方法更為適合。

識(shí)別工作主要有以下幾個(gè)步驟:

1. 初始化機(jī)器學(xué)習(xí)算法,及其訓(xùn)練

knn=new CvKNearest( trainData, trainClasses, 0, false, K );

因?yàn)閠rainData, trainClasses數(shù)據(jù)已得到。訓(xùn)練在CvKNearest算法初始化中已經(jīng)完成

2. 識(shí)別

獲取識(shí)別測(cè)試的數(shù)據(jù),testData

result=knn->find_nearest(testData,K,0,0,nearest,0);

result為返回的識(shí)別的結(jié)果

?

?

4.?? 實(shí)驗(yàn)結(jié)果

在knn參數(shù)k=5,子圖像向量大小選取128*128像素,訓(xùn)練樣本50副圖片,測(cè)試樣本50副圖片,系統(tǒng)誤識(shí)率為7.4%。對(duì)于用戶(hù)手寫(xiě)阿拉伯?dāng)?shù)字2的識(shí)別結(jié)果為2,識(shí)別比較準(zhǔn)確。

?

?

?

5.?? 未來(lái)的工作

本程序主要參照網(wǎng)上的一些實(shí)例完成了部署跟實(shí)驗(yàn)工作,雖然僅僅完成了手寫(xiě)阿拉伯?dāng)?shù)字的識(shí)別工作,但是字符識(shí)別的一些原理工作都是相同的,未來(lái)能夠從一下幾個(gè)方面進(jìn)行提高:

1.????? 提高程序的識(shí)別準(zhǔn)確率,從一些文獻(xiàn)實(shí)現(xiàn)的結(jié)果來(lái)看,簡(jiǎn)單的模型結(jié)合大量的訓(xùn)練樣本,往往效果比復(fù)雜的模型結(jié)合少量訓(xùn)練樣本實(shí)現(xiàn)的效果好。

2.????? 擴(kuò)展程序的功能,從實(shí)現(xiàn)簡(jiǎn)單的字符到最終實(shí)現(xiàn)識(shí)別手寫(xiě)漢字等。

3.????? 提高識(shí)別速度,改進(jìn)算法為并行算法,實(shí)現(xiàn)如聯(lián)機(jī)在線識(shí)別等。

?

?

6.主要參考文獻(xiàn):

http://blog.csdn.net/jackmacro/article/details/7026211

http://blog.damiles.com/2008/11/basic-ocr-in-opencv/

http://blog.csdn.net/zhubenfulovepoem/article/details/6803150

http://blog.csdn.net/firehood_/article/details/8433077

http://blog.csdn.net/viewcode/article/details/7943341

?

?

7.項(xiàng)目打包下載

http://download.csdn.net/detail/wangyaninglm/6631953

?

8.手寫(xiě)字符識(shí)別的復(fù)雜版本,這個(gè)增加了一些OpenGL技術(shù),程序比較復(fù)雜

http://blog.csdn.net/wangyaninglm/article/details/41848019

轉(zhuǎn)載于:https://www.cnblogs.com/wuyida/p/6301467.html

總結(jié)

以上是生活随笔為你收集整理的OpenCV手写数字字符识别(基于k近邻算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。