图片上的数字识别

17 篇文章 0 订阅

步骤:

1.图像分割->制作模板;

2.目标图片分割->比对识别;

#include <stdio.h>
#include <stdlib.h>
#include <opencv\cv.hpp>
#include <opencv2\opencv.hpp>
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace cv;
using namespace std;

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;
}

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 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);
		//cout <<i<<" th "<< colValue << endl;
		if (colValue>0)
		{
			top = i;
			break;
		}
	}
	for (; i < src.rows; i++)
	{
		int colValue = getRowSum(src, i);
		//cout << i << " th " << colValue << endl;
		if (colValue == 0)
		{
			bottom = i;
			break;
		}
	}

	int height = bottom - top;
	Rect rect(0, top, src.cols, height);
	dstImg = src(rect).clone();
}

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);
		//cout <<i<<" th "<< colValue << endl;
		if (colValue>0)
		{
			left = i;
			break;
		}
	}
	if (left == 0)
	{
		return 1;
	}


	for (; i < src.cols; i++)
	{
		int colValue = getColSum(src, i);
		//cout << i << " th " << colValue << endl;
		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;
}


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 = 10000000;
	int serieNum = 0;
	for (int i = 0; i < TemplateNum; i++){
		char name[20];
		sprintf_s(name, "D:\\%dLeft.jpg", i);
		Mat Template = imread(name, CV_LOAD_IMAGE_GRAYSCALE);
		threshold(Template, Template, 200, 255, CV_THRESH_BINARY);
		threshold(src, src, 80, 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);
		//imshow(name, Template);
		absdiff(Template, src, img_result);
		int diff = 0;
		getPXSum(img_result, diff);
		if (diff < min)
		{
			min = diff;
			serieNum = i;
		}
	}
	if(serieNum!=10)
	{
		/*
	printf("最小距离是%d ", min);
	printf("匹配到第%d个模板匹配的数字是%d\n", serieNum,serieNum);*/
	cout<<serieNum;
	}
	return serieNum;
}




	

int main()
{

	clock_t startTime,mattime,endTime;  
    startTime = clock(); 
	 RECT rc;
   HWND hwnd = FindWindow(NULL,TEXT("开奖数据-北京时时彩")); //注意窗口不能最小化 
   if (hwnd == NULL)
   { 
      cout << "找不到窗口" << endl;
      return 0;
   }
   GetClientRect(hwnd, &rc);
 
  //创建空位图
   HDC hdcScreen = GetDC(NULL);
   HDC hdc = CreateCompatibleDC(hdcScreen);
   HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);  
   SelectObject(hdc, hbmp); 
   //得到目标窗口位图
   PrintWindow(hwnd, hdc, PW_CLIENTONLY);
   BITMAP bm;//图像信息;
   GetObject(hbmp, sizeof(bm), (LPSTR)&bm);
   //把bmp图像转为Mat类型进行opencv的函数操作;
    Mat dst;
	dst.create(cvSize(bm.bmWidth,bm.bmHeight),CV_8UC4);
	GetBitmapBits(hbmp,bm.bmWidth*bm.bmHeight*4,dst.data);
    cvtColor(dst,dst,CV_BGRA2BGR);   
	imshow("cap",dst);
	//释放dc
   DeleteDC(hdc); 
   DeleteObject(hbmp); 
   ReleaseDC(NULL, hdcScreen); 

     cout<<"开奖数据识别结果:"<<endl;
	 int roiheight=bm.bmHeight-125;
	 for(int k=0;k<roiheight/33;k++)//roiheight/33
	 {
		 mattime=clock();
	 Rect re(210,125+k*33,100,30);
	 Mat src(dst,re);
	 imshow("roi",src);
	 cvtColor(src,src,CV_BGR2GRAY); 
	//Mat src = imread("D:\\1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
	threshold(src, src, 100 , 255, CV_THRESH_BINARY);
	//adaptiveThreshold(src, src, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 31,0);
	bitwise_not(src,src);
	imshow("origin", src);
	//imwrite("d:\\sa.bmp",src);
	
	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++;
		imshow(nameLeft, leftImg);
		stringstream ss;
		ss << nameLeft;
		imwrite("D:\\" + ss.str() + ".jpg", leftImg);
		ss >> nameLeft;*/
		//检测//
		Mat srcTmp = rightImg;
		getSubtract(leftImg, 11);
		res = cutLeft(srcTmp, leftImg, rightImg);	
	}
	cout<<endl;
	 }
	 endTime = clock();  
	 cout<<"图像处理时间"<<(double)(mattime - startTime) / CLOCKS_PER_SEC<<"s"<<endl;
    cout << "Totle Time : " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl; 
	waitKey(0);
	return 0;
}



  • 1
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: OCR(Optical Character Recognition,光学字符识别技术)是一种通过计算机对纸质文件或图像文件进行扫描后,将其的文字、图像、符号等内容转化为计算机可处理的文本格式的技术。 图片数字识别OCR是OCR技术的一种应用,它主要针对数字图片进行识别和处理。这种技术可以帮助人们快速准确地识别数字图片上的内容,节省人力和时间成本。 利用数字图片识别OCR技术可以对很多场景产生帮助。比如,将银行卡照片的卡号识别出来,实现自动化的银行卡绑定操作。又如,在图书馆,将图书条形码拍照上传,即可自动识别图书信息,快速入库。 数字图片识别OCR技术目前在智能家居、无人驾驶、人脸识别等领域也有广泛应用。但同时,图片数字识别OCR技术面临的挑战也不容小觑。如何提高OCR的识别精度、如何面对光线、质量等各种影响因素,都是数字图片OCR技术需要进一步解决的问题。 总之,图片数字识别OCR这种人工智能技术,为我们的日常工作和生活带来了极大的便利,也极大地改善了我们的信息处理效率。 ### 回答2: OCR全称为Optical Character Recognition,是指利用光学识别技术,对各种印刷体字符进行自动识别和转换的过程。图片数字识别OCR是OCR的一个应用场景,就是利用计算机视觉技术,将图片数字识别出来。 图片数字识别OCR在很多场景下都非常有用。比如在银行柜员机上,用户需要输入卡密码、转账金额等数字信息。如果可以采用图片数字识别OCR技术,用户就可以直接拍照输入,避免了输错信息的风险,同时也提高了使用体验。 图片数字识别OCR技术基于深度学习模型,使用大量的图片数据进行训练,从而使计算机能够感知数字的特征,并将其识别出来。由于数字样式多种多样,同时图片也可能有各种噪音,所以实现高精度的图片数字识别OCR是非常具有挑战性的。 目前,图片数字识别OCR技术已经在各种领域广泛应用,比如在扫描仪、银行、数字验证、数学题识别等方面。随着技术的不断进步,图片数字识别OCR的精度和速度会不断提高,未来也将在更多场景得到应用。 ### 回答3: OCR是Optical Character Recognition的缩写,意为光学字符识别,在计算机图像处理应用较为广泛。它的主要功能是识别数字、字母等字符,并将其转换为计算机可读取的数据。图片数字识别OCR是其的一种应用,它可以将包含数字图片自动识别,并将数字转化为计算机可以处理的内容。 图片数字识别OCR的应用十分广泛。例如,在银行,它可以用于识别支票号码、金额等信息;在物流行业,它可以用于识别快递单上的号码;在图书馆,它可以用于识别书刊的ISBN码等。简单来说,任何需要将图片数字转换为数据的地方,都可以应用图片数字识别OCR技术。 该技术的实现主要依赖于计算机视觉和机器学习技术。在图像处理上,需要对图片进行预处理,如去除噪声、调整亮度、对比度等;在识别数字上,需要对图像进行特征提取,并通过机器学习算法进行分类识别。目前,该技术已经被广泛应用,并且不断取得进展,将来可望在更多领域得到应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值