/*****************************************************
图片数字识别
*****************************************************/
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include<windows.h>
#include<iostream>
using namespace std;
using namespace cv;
int getColSum(Mat src, int col); //列求和
int cutLeft(Mat& src, Mat& leftImg, Mat& rightImg);//左右切割
void cutTop(Mat& src, Mat& dstImg);//上下切割
int getRowSum(Mat src, int row); //航求和
void getPXSum(Mat &src, int &a);//获取所有像素点和
int getSubtract(Mat &src, int TemplateNum);
void pictureCut(); //模板数字图片切割
LPCWSTR dirName = L".\\AAA"; //保存分割后照片的文件夹
int main()
{
pictureCut();
//创建文件夹保存分割后的照片
BOOL flag = CreateDirectory(dirName, NULL);
Mat src = imread(".\\sss.png", CV_LOAD_IMAGE_GRAYSCALE);
threshold(src, src, 100, 255, CV_THRESH_BINARY_INV);
imshow("原始灰度图二值处理后", src);
printf("识别的数字是:\n");
Mat leftImg, rightImg;
int res = cutLeft(src, leftImg, rightImg);
int i = 0;
while (res == 0)
{
char nameLeft[10];
sprintf(nameLeft, "%dLeft", i);
Mat srcTmp = rightImg;
getSubtract(leftImg, 10);//数字识别
res = cutLeft(srcTmp, leftImg, rightImg);
}
waitKey(0);
return 0;
}
//模板数字图片切割
void pictureCut()
{
Mat src = imread(".\\base.png", CV_LOAD_IMAGE_GRAYSCALE);
threshold(src, src, 100, 255, CV_THRESH_BINARY_INV);
Mat leftImg, rightImg;
int res = cutLeft(src, leftImg, rightImg);
int i = 0;
while (res == 0)
{
char nameLeft[10];
sprintf(nameLeft, "%dLeft", i);
char nameRight[10];
sprintf(nameRight, "%dRight", i);
i++;
stringstream ss;
ss << nameLeft;
imwrite(".\\AAA\\" + ss.str() + ".jpg", leftImg);//保存截取图片做为模板
ss >> nameLeft;
Mat srcTmp = rightImg;
res = cutLeft(srcTmp, leftImg, rightImg);
}
}
int cutLeft(Mat& src, Mat& leftImg, Mat& rightImg)//左右切割
{
int left, right;
left = 0;
right = src.cols;
int i;
for (i = 0; i < src.cols; i++)
{
int colValue = getColSum(src, i);
if (colValue > 0)
{
left = i;
break;
}
}
if (left == 0)
{
return 1;
}
for (; i < src.cols; i++)
{
int colValue = getColSum(src, i);
if (colValue == 0)
{
right = i;
break;
}
}
int width = right - left;
Rect rect(left, 0, width, src.rows);
leftImg = src(rect).clone();
Rect rectRight(right, 0, src.cols - right, src.rows);
rightImg = src(rectRight).clone();
cutTop(leftImg, leftImg);
return 0;
}
int getColSum(Mat src, int col)
{
int sum = 0;
int height = src.rows;
int width = src.cols;
for (int i = 0; i < height; i++)
{
sum = sum + src.at <uchar>(i, col);
}
return sum;
}
void cutTop(Mat& src, Mat& dstImg)//上下切割
{
int top, bottom;
top = 0;
bottom = src.rows;
int i;
for (i = 0; i < src.rows; i++)
{
int colValue = getRowSum(src, i);
if (colValue > 0)
{
top = i;
break;
}
}
for (; i < src.rows; i++)
{
int colValue = getRowSum(src, i);
if (colValue == 0)
{
bottom = i;
break;
}
}
int height = bottom - top;
Rect rect(0, top, src.cols, height);
dstImg = src(rect).clone();
}
int getRowSum(Mat src, int row)
{
int sum = 0;
int height = src.rows;
int width = src.cols;
for (int i = 0; i < width; i++)
{
sum += src.at <uchar>(row, i);
}
return sum;
}
void getPXSum(Mat &src, int &a)//获取所有像素点和
{
threshold(src, src, 100, 255, CV_THRESH_BINARY);
a = 0;
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
a += src.at <uchar>(i, j);
}
}
}
int getSubtract(Mat &src, int TemplateNum) //两张图片相减
{
Mat img_result;
int min = 1000000;
int serieNum = 0;
for (int i = 0; i < TemplateNum; i++)
{
char name[20];
sprintf_s(name, ".\\AAA\\%dLeft.jpg", i);
Mat Template = imread(name, CV_LOAD_IMAGE_GRAYSCALE);
threshold(Template, Template, 100, 255, CV_THRESH_BINARY);
threshold(src, src, 100, 255, CV_THRESH_BINARY);
resize(src, src, Size(32, 48), 0, 0, CV_INTER_LINEAR);
resize(Template, Template, Size(32, 48), 0, 0, CV_INTER_LINEAR);//调整尺寸
absdiff(Template, src, img_result);
int diff = 0;
getPXSum(img_result, diff);
if (diff < min)
{
min = diff;
serieNum = i;
}
}
printf("%d ", serieNum);
return serieNum;
}
C++/OpenCV2.4.xx印刷数字精确识别源码
3星 · 超过75%的资源 需积分: 25 50 浏览量
2018-11-06
16:32:03
上传
评论 2
收藏 15.2MB ZIP 举报
rrr2
- 粉丝: 932
- 资源: 13
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈