#include "basicOCR.h"
void basicOCR::preprocessing(Mat &srcimage, int new_width, int new_height)
{
Mat src = srcimage.clone();
int row_min = src.rows - 1;
int row_max = 0;
int col_min = src.cols - 1;
int col_max = 0;
int nl = src.rows; //行数
int nc = src.cols; //列数
for (int j = 0; j<nl; j++)
{
uchar* data = src.ptr<uchar>(j);
for (int i = 0; i<nc; i++)
{
if (data[i] == 0)
{
if (j < row_min) row_min = j;
if (j > row_max) row_max = j;
if (i < col_min) col_min = i;
if (i > col_max) col_max = i;
}
}
}
int ROI_width = col_max - col_min;
int ROI_height = row_max - row_min;
int size = (ROI_width>ROI_height) ? ROI_width : ROI_height;//学习这种用法
Mat imageROI = src(Rect(col_min, row_min, ROI_width, ROI_height));
Mat tem;
resize(imageROI, tem, Size(new_width, new_height), CV_INTER_LINEAR);
threshold(tem, tem, 100, 255, THRESH_OTSU);
srcimage.release();
srcimage.create(1, new_width*new_height, CV_32FC1);
float* data1 = srcimage.ptr<float>(0);
nl = tem.rows; //行数
nc = tem.cols; //列数
for (int j = 0; j<nl; j++)
{
uchar* data = tem.ptr<uchar>(j);
for (int i = 0; i<nc; i++)
{
if (data[i] == 255) data1[j*new_height + i] = 1;
else data1[j*new_height + i] = 0;
}
}
}
basicOCR::basicOCR()//构造函数
{
//initial
sprintf(file_path, "OCR/");
train_samples = 50;//训练样本,总共100个,50个训练,50个测试
classes = 10;//暂时识别十个数字
size = 128;//
trainData.create(train_samples*classes, size*size, CV_32FC1);//训练数据的矩阵
trainClasses.create(train_samples*classes, 1, CV_32FC1);
//Get data (get images and process it)
getData();
//train
train();
//Test
test();
printf(" ------------------------------------------------------------------------\n");
printf("|\t识别结果\t|\t 测试精度\t|\t 准确率\t|\n");
printf(" ------------------------------------------------------------------------\n");
}
void basicOCR::getData()
{
Mat src_image;
char file[255];
int i, j;
for (i = 0; i<classes; i++)
{
for (j = 0; j< train_samples; j++)
{
//加载pbm格式图像,作为训练
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 = imread(file, 0);
if (src_image.empty())
{
printf("Error: Cant load image %s\n", file);
//exit(-1);
}
//process file
preprocessing(src_image, size, size);
//Set data
float* data1 = trainData.ptr<float>(i*train_samples+j);
float* data2 = src_image.ptr<float>(0);
for (int k = 0; k < src_image.cols; k++)
{
data1[k] = data2[k];
}
//Set class label
trainClasses.at<float>(i*train_samples + j, 0) = i;
}
}
}
void basicOCR::train()
{
knn = new KNearest(trainData, trainClasses, Mat(), false, K);
}
float basicOCR::classify(Mat img, int showResult)//第二个参数主要用来控制是测试训练样本还是手写识别
{
Mat nearest;
nearest.create(1, K, CV_32FC1);
float result;
//处理输入的图像
preprocessing(img, size, size);
Mat tem1, tem2;
result = knn->find_nearest(img, K, tem1, nearest, tem2);
int accuracy = 0;
for (int i = 0; i<K; i++)
{
if (nearest.at<float>(0, 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",result,pre,accuracy,K);
printf(" ------------------------------------------------------------------------\n");
}*/
printf("|\t %.0f \t| \t %.2f%% \t| \t %d of %d \t| \n", result, pre, accuracy, K);
printf(" ------------------------------------------------------------------------\n");
return result;
}
void basicOCR::test()
{
Mat src_image;
IplImage prs_image;
CvMat row, data;
char file[255];
int i, j;
int error = 0;
int testCount = 0;
for (i = 0; i<classes; i++)
{
for (j = 50; j< 50 + train_samples; j++)//五十个测试样本,计算一下错误率
{
sprintf(file, "%s%d/%d%d.pbm", file_path, i, i, j);
src_image = imread(file, 0);
if (src_image.empty())
{
printf("Error: Cant load image %s\n", file);
exit(-1);
}
//process file
//preprocessing(src_image, size, size);//归一化图片
float r = classify(src_image, 0);//检验图片
if ((int)r != i)
error++;
testCount++;
}
}
float totalerror = 100 * (float)error / (float)testCount;
printf("测试系统误识率: %.2f%%\n", totalerror);
}
没有合适的资源?快使用搜索试试~ 我知道了~
opencv 基于knn的手写数字字符识别
共1031个文件
pbm:1007个
tlog:6个
obj:3个
3星 · 超过75%的资源 需积分: 38 190 下载量 70 浏览量
2016-07-21
09:25:36
上传
评论 1
收藏 2.44MB 7Z 举报
温馨提示
本文为opencv 基于knn的手写数字字符识别,开发环境为vs2013+opencv2.4.13,欢迎下载学习
资源推荐
资源详情
资源评论
收起资源包目录
opencv 基于knn的手写数字字符识别 (1031个子文件)
basicOCR.cpp 4KB
main.cpp 4KB
Threshold_test.exe 88KB
Threshold_test.vcxproj.filters 1KB
basicOCR.h 589B
vc120.idb 867KB
Threshold_test.ilk 471KB
Threshold_test.lastbuildstate 294B
Threshold_test.log 4KB
visionchao.obj 290KB
main.obj 206KB
basicOCR.obj 189KB
889.pbm 16KB
816.pbm 16KB
869.pbm 16KB
468.pbm 16KB
479.pbm 16KB
815.pbm 16KB
849.pbm 16KB
850.pbm 16KB
870.pbm 16KB
440.pbm 16KB
408.pbm 16KB
414.pbm 16KB
927.pbm 16KB
888.pbm 16KB
409.pbm 16KB
405.pbm 16KB
988.pbm 16KB
944.pbm 16KB
423.pbm 16KB
486.pbm 16KB
979.pbm 16KB
830.pbm 16KB
434.pbm 16KB
451.pbm 16KB
436.pbm 16KB
957.pbm 16KB
808.pbm 16KB
857.pbm 16KB
828.pbm 16KB
880.pbm 16KB
803.pbm 16KB
487.pbm 16KB
406.pbm 16KB
450.pbm 16KB
980.pbm 16KB
907.pbm 16KB
931.pbm 16KB
885.pbm 16KB
401.pbm 16KB
976.pbm 16KB
444.pbm 16KB
488.pbm 16KB
901.pbm 16KB
912.pbm 16KB
464.pbm 16KB
459.pbm 16KB
473.pbm 16KB
430.pbm 16KB
407.pbm 16KB
447.pbm 16KB
416.pbm 16KB
807.pbm 16KB
466.pbm 16KB
918.pbm 16KB
917.pbm 16KB
868.pbm 16KB
800.pbm 16KB
810.pbm 16KB
822.pbm 16KB
854.pbm 16KB
480.pbm 16KB
840.pbm 16KB
413.pbm 16KB
812.pbm 16KB
484.pbm 16KB
864.pbm 16KB
899.pbm 16KB
947.pbm 16KB
900.pbm 16KB
851.pbm 16KB
452.pbm 16KB
905.pbm 16KB
874.pbm 16KB
802.pbm 16KB
894.pbm 16KB
842.pbm 16KB
848.pbm 16KB
843.pbm 16KB
453.pbm 16KB
879.pbm 16KB
841.pbm 16KB
861.pbm 16KB
461.pbm 16KB
923.pbm 16KB
933.pbm 16KB
866.pbm 16KB
893.pbm 16KB
891.pbm 16KB
共 1031 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
资源评论
- neewen2017-05-02资源很棒,可以学习,谢谢
- NCHFGFB2017-07-16程序能够运行,配置了opencv之后就可以,有学习价值,但是感觉不够好粗糙
- jiyiyao70472018-01-03错误 5 error C2259: “cv::ml::KNearest”: 不能实例化抽象类
徐大大平凡之路
- 粉丝: 356
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功