资源简介
读取手写数字0~9的图像,按照模板匹配方式完成手写数字的识别。环境:opencv3.4.4 + vs2015
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
using namespace cv;
void staData(int test[50] int sample[10][50] double(&num)[3]);//统计识别结果
int getDist(int test[50] int sample[50]);//计算欧式距离
void readImg(Mat &src int(&test)[50] int i);//读取图片并进行预处理
void getPXSum(Mat &src int(&test)[50]);//对图像进行区域分割并字符串化图片区域
void readNum(int(&test)[50]);//输出字符串(测试用)
int cutLeft(Mat& src Mat& leftImg Mat& rightImg);//左右切割
void cutTop(Mat& src Mat& dstImg);//上下切割
int getColSum(Mat src int col);//统计所有列像素的总和
int getRowSum(Mat src int row);//统计所有行像素的总和
int main()
{
int sample[10][10][50];//保存样本图片字符串,每个数字10副图
double num[10][3] = {0};//统计结果
int test[50];//保存测试图片字符串
int test_num = 9;//测试的数字
int true_num = 0;//数字的识别结果
printf_s(“测试样本\n“);
char name[100];
sprintf_s(name “C:\\Users\\52840\\Desktop\\mnist数据集\\mnist_part\\t%d.jpg“ test_num);
Mat src = imread(name CV_LOAD_IMAGE_GRAYSCALE);//读取图片
readImg(src test test_num);
readNum(test);
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
//printf_s(“与第%d个模板“ i * 10 + j);
char name[100];
sprintf_s(name “C:\\Users\\52840\\Desktop\\mnist数据集\\mnist_part\\%d_%d.jpg“ i j);
Mat Template = imread(name CV_LOAD_IMAGE_GRAYSCALE);//读取模板
readImg(Template sample[i][j] i);
//readNum(sample[i]);
//printf_s(“欧式距离:“);
//printf_s(“%d\n“ getDist(test sample[i][j]));
}
staData(test sample[i] num[i]);
printf_s(“数字%d的统计结果:\n“ i);
printf_s(“识别正确率:%lf\n“ num[i][0]);
printf_s(“识别错误率:%lf\n“ num[i][1]);
printf_s(“拒绝识别率:%lf\n“ num[i][2]);
//printf_s(“\n\n“);
if (i > 0)
{
if (num[i][0]>num[i-i][0])
{
true_num = i;
}
}
}
printf_s(“识别结果为:%d“ true_num);
waitKey(0);
getchar();
return 0;
}
void getPXSum(Mat &src int(&test)[50])//对图像进行区域分割并字符串化图片区域
{
int mark = 0 count = 0;
//threshold(src src 100 1 CV_THRESH_BINARY);
while (mark<49)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (src.at (i + 3 * (mark / 7) j + 3 * (mark % 7))>200) count++;
//printf_s(“%d“src.at (i + 3 * (mark % 7) j + 3 * (mark / 7)));
}
//printf_s(“\n“);
}
if (count > 5) test[mark] = 1;
else
{
test[mark] = 0;
}
//printf_s(“黑色像素占该3*3区域的%d/9\n“ count);
count = 0;
mark++;
}
}
void readImg(Mat &src int(&test)[50] int i)
{
//imshow(“origin0“ src);//显示原图片
medianBlur(src src 3);//中值滤波去椒盐噪声
//imshow(“origin2“ src);//显示去噪后图片
Mat element = getStructuringElement(MORPH_RECT Size(2 2));
dilate(src src element);
//imshow(“origin3“ src);//显示膨胀后图片
threshold(src src 100 255 THRESH_BINARY);
Mat rightImg leftImg;
cutLeft(src leftImg rightImg);
//imshow(“origin4“ leftImg);//显示切割后图片
resize(leftImg leftImg Size(21 21) 0 0 CV_
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 888 2020-03-03 22:05 mnist_part\0_0.jpg
文件 892 2020-03-03 22:05 mnist_part\0_1.jpg
文件 815 2020-03-03 22:05 mnist_part\0_2.jpg
文件 1051 2020-03-03 22:05 mnist_part\0_3.jpg
文件 890 2020-03-03 22:05 mnist_part\0_4.jpg
文件 895 2020-03-03 22:05 mnist_part\0_5.jpg
文件 946 2020-03-03 22:05 mnist_part\0_6.jpg
文件 907 2020-03-03 22:05 mnist_part\0_7.jpg
文件 1001 2020-03-03 22:05 mnist_part\0_8.jpg
文件 993 2020-03-03 22:05 mnist_part\0_9.jpg
文件 655 2020-03-03 22:09 mnist_part\1_0.jpg
文件 651 2020-03-03 22:09 mnist_part\1_1.jpg
文件 705 2020-03-03 22:09 mnist_part\1_2.jpg
文件 724 2020-03-03 22:09 mnist_part\1_3.jpg
文件 853 2020-03-03 22:09 mnist_part\1_4.jpg
文件 719 2020-03-03 22:09 mnist_part\1_5.jpg
文件 665 2020-03-03 22:09 mnist_part\1_6.jpg
文件 648 2020-03-03 22:09 mnist_part\1_7.jpg
文件 736 2020-03-03 22:09 mnist_part\1_8.jpg
文件 781 2020-03-03 22:09 mnist_part\1_9.jpg
文件 900 2020-03-03 22:07 mnist_part\2_0.jpg
文件 824 2020-03-03 22:07 mnist_part\2_1.jpg
文件 882 2020-03-03 22:07 mnist_part\2_2.jpg
文件 916 2020-03-03 22:07 mnist_part\2_3.jpg
文件 895 2020-03-03 22:07 mnist_part\2_4.jpg
文件 945 2020-03-03 22:07 mnist_part\2_5.jpg
文件 892 2020-03-03 22:07 mnist_part\2_6.jpg
文件 925 2020-03-03 22:07 mnist_part\2_7.jpg
文件 756 2020-03-03 22:07 mnist_part\2_8.jpg
文件 864 2020-03-03 22:07 mnist_part\2_9.jpg
文件 883 2020-03-03 22:11 mnist_part\3_0.jpg
............此处省略134个文件信息
评论
共有 条评论