資源簡(jiǎn)介
實(shí)現(xiàn)了基于opencv 的手寫數(shù)字字符識(shí)別
主要參照文章:
http://blog.damiles.com/2008/11/basic-ocr-in-opencv/
基本上就是按著人家的代碼來配置的,完后小改動(dòng)了幾個(gè)參數(shù),寫了一個(gè)文檔,方便大家學(xué)習(xí)吧。
代碼片段和文件信息
/*
?*??basicOCR.c
?*??
?*
?*??Created?by?damiles?on?18/11/08.
?*??Copyright?2008?Damiles.?GPL?License
?*
?*/
#ifdef?_CH_
#pragma?package?
#endif
#ifndef?_EiC
#include?“cv.h“
#include?“highgui.h“
#include?“ml.h“
#include?
#include?
#include?
#endif
#include?“preprocessing.h“
#include?“basicOCR.h“
basicOCR::basicOCR()//構(gòu)造函數(shù)
{
//initial
sprintf(file_path??“OCR/“);
train_samples?=?50;//訓(xùn)練樣本,總共100個(gè),50個(gè)訓(xùn)練,50個(gè)測(cè)試
classes=?10;//暫時(shí)識(shí)別十個(gè)數(shù)字
size=128;//
trainData?=?cvCreateMat(train_samples*classes?size*size?CV_32FC1);//訓(xùn)練數(shù)據(jù)的矩陣
trainClasses?=?cvCreateMat(train_samples*classes?1?CV_32FC1);
//Get?data?(get?images?and?process?it)
getData();
//train
train();
//Test
test();
printf(“?------------------------------------------------------------------------\n“);
printf(“|\t識(shí)別結(jié)果\t|\t?測(cè)試精度\t|\t??準(zhǔn)確率\t|\n“);
printf(“?------------------------------------------------------------------------\n“);
}
void?basicOCR::getData()
{
IplImage*?src_image;
IplImage?prs_image;
CvMat?rowdata;
char?file[255];
int?ij;
for(i?=0;?i {
for(?j?=?0;?j {
//加載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(file0);
if(!src_image)
{
printf(“Error:?Cant?load?image?%s\n“?file);
//exit(-1);
}
//process?file
prs_image?=?preprocessing(src_image?size?size);
//Set?class?label
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?);
//convert?8?bits?image?to?32?float?image
cvConvertScale(&prs_image?img?0.0039215?0);
cvGetSubRect(img?&data?cvRect(00?sizesize));
CvMat?row_header?*row1;
//convert?data?matrix?sizexsize?to?vecor
row1?=?cvReshape(?&data?&row_header?0?1?);
cvCopy(row1?&row?NULL);
}
}
}
void?basicOCR::train()
{
knn=new?CvKNearest(?trainData?trainClasses?0?false?K?);
}
float?basicOCR::classify(IplImage*?img?int?showResult)//第二個(gè)參數(shù)主要用來控制是測(cè)試訓(xùn)練樣本還是手寫識(shí)別
{
IplImage?prs_image;
CvMat?data;
CvMat*?nearest=cvCreateMat(1KCV_32FC1);
float?result;
//處理輸入的圖像
prs_image?=?preprocessing(img?size?size);
//Set?data?
IplImage*?img32?=?cvCreateImage(?cvSize(?size?size?)?IPL_DEPTH_32F?1?);
cvConvertScale(&prs_image?img32?0.0039215?0);
cvGetSubRect(img32?&data?cvRect(00?sizesize));
CvMat?row_header?*row1;
row1?=?cvReshape(?&data?&row_header?0?1?);
result=knn->find_nearest(row1K00nearest0);
int?accuracy=0;
for(int?i=0;i {
if(?(nearest->data.fl[i])?==?result)
????????????????????accuracy++;
}
float?pre=100*((float)accuracy/(float)K);
if(showResult==1)
{
printf(“|\t????%.0f????\t|?\t????%.2f%%??\t|?\t?%d?of?%d?\t|?\n“resultpreaccuracyK);
printf(“?------------
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件?????248320??2013-11-29?17:36??基于opencv?的手寫數(shù)字字符識(shí)別\基于opencv的手寫數(shù)字字符識(shí)別.doc
?????文件????1539898??2013-11-19?11:03??基于opencv?的手寫數(shù)字字符識(shí)別\基于OpenCV的脫機(jī)手寫字符識(shí)別技術(shù)_許雁飛.pdf
?????文件??????87515??2013-11-27?19:24??基于opencv?的手寫數(shù)字字符識(shí)別\實(shí)驗(yàn)結(jié)果截圖\實(shí)驗(yàn)結(jié)果2.jpg
?????文件??????89254??2013-11-27?19:26??基于opencv?的手寫數(shù)字字符識(shí)別\實(shí)驗(yàn)結(jié)果截圖\實(shí)驗(yàn)結(jié)果9.jpg
?????文件??????29696??2013-11-24?22:12??基于opencv?的手寫數(shù)字字符識(shí)別\流程圖\主流程圖.vsd
?????文件??????59904??2013-11-25?17:39??基于opencv?的手寫數(shù)字字符識(shí)別\流程圖\細(xì)化流程圖.vsd
?????文件???23581429??2013-11-28?16:19??基于opencv?的手寫數(shù)字字符識(shí)別\源代碼\VS工程\Character_Recognition.rar
?????文件???????3885??2013-11-27?20:08??基于opencv?的手寫數(shù)字字符識(shí)別\源代碼\代碼\basicOCR.cpp
?????文件????????608??2013-11-26?17:34??基于opencv?的手寫數(shù)字字符識(shí)別\源代碼\代碼\basicOCR.h
?????文件???????3534??2013-11-25?22:47??基于opencv?的手寫數(shù)字字符識(shí)別\源代碼\代碼\main.cpp
?????文件???????3013??2013-11-27?17:53??基于opencv?的手寫數(shù)字字符識(shí)別\源代碼\代碼\preprocessing.cpp
?????文件????????319??2013-11-21?20:47??基于opencv?的手寫數(shù)字字符識(shí)別\源代碼\代碼\preprocessing.h
?????文件????2992128??2013-11-27?20:08??基于opencv?的手寫數(shù)字字符識(shí)別\程序\Character_Recognition.exe
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\000.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\001.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\002.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\003.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\004.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\005.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\006.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\007.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\008.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\009.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\010.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\011.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\012.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\013.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\014.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\015.pbm
?????文件??????16580??2012-07-02?01:25??基于opencv?的手寫數(shù)字字符識(shí)別\程序\OCR\0\016.pbm
............此處省略1005個(gè)文件信息
評(píng)論
共有 條評(píng)論