opencv简易数字识别

这篇具有很好参考价值的文章主要介绍了opencv简易数字识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

使用opencv,进行简单的数字识别

注意:此案例中的数字识别仅当做学习参考,想要真正实现数字识别,实际情况复杂很多

思路

①图片预处理,将图片转灰度后再二值化,使其变成白字黑底

②查找外接矩形,找到原图中数字的最外层轮廓,根据最外层轮廓找到外接矩形

③模板匹配,以外接矩形为ROI区域,截取数字区域,与模板进行匹配

④输出结果

具体步骤

首先读入一张原图,备份(后面需要用),将其转灰度,然后二值化,再备份(后面需要用),因为查找轮廓会破坏原图,所以需要备份,然后我这素材原图就是很简单的黑底写了白字,没有其他噪声之类的,所以只需转灰度然后二值化,如果是其他图片,可能还需要滤波,腐蚀膨胀去除噪声,如果去除不不干净,还需要过滤一下,因为我们只需要得到数字的轮廓,而且最后要变成白字黑底,如下图所示

Mat img = imread("kk.png");  
Mat clone_img = img.clone(); //原图备份
cvtColor(img, img, COLOR_BGR2GRAY); //图片转灰度
threshold(img, img, 100, 255, THRESH_BINARY); //二值化
Mat clone_img1 = img.clone(); //备份二值化后的原图

opencv简易数字识别

然后就要开始查找轮廓了,找到轮廓后(可以不绘制轮廓和外接矩形),根据轮廓找到外接矩形,这时我们再定义一个存储原图中有效数字区域的容器,因为你找到外接矩形后,直接ROI就可以截取到该数字,注意,我们要在之前备份的二值化原图中来进行ROI截取,并且重设大小为我们模板图的大小,然后我们把该数字存起来,用于后面的识别

vector<vector<Point>> contours; //存储原图轮廓
vector<Vec4i> hierarcy;
findContours(img, contours, hierarcy, RETR_EXTERNAL, CHAIN_APPROX_NONE);//查找轮廓
drawContours(clone_img, contours, -1, Scalar(0, 255, 0), 1, 8);//绘制轮廓
vector<Rect> sort_rect(contours.size()); //外接矩形
vector<Mat> img_mat;//存储原图中的有效数字区域
for (int i = 0; i < contours.size(); i++)
{
	sort_rect[i] = boundingRect(contours[i]); //外接矩形
	Mat roi = clone_img1(sort_rect[i]);
	Mat dstroi;
	resize(roi, dstroi, Size(40, 50), 0, 0); //重设大小
	img_mat.push_back(dstroi);
    //绘制外接矩形
	rectangle(clone_img, Point(sort_rect[i].x, sort_rect[i].y),
	Point(sort_rect[i].x + sort_rect[i].width, sort_rect[i].y + sort_rect[i].height), 
     Scalar(0, 0, 255), 1, 8);
}

opencv简易数字识别

然后我们要对轮廓进行排序,因为opencv查找的轮廓并不是按顺序的,而是随机的,但是我们识别数字肯定是要按顺序,不然识别结果肯定是错误的,我们可以根据轮廓的外接矩形的x坐标来排序,从左往右x坐标依次增大,这里使用冒泡排序,排序过后的顺序就是原图中数字的正确顺序

//对矩形进行排序,因为轮廓的顺序不一定是数字真正的顺序
for (int i = 0; i < sort_rect.size(); i++)
{
	for (int j = i + 1; j < sort_rect.size(); j++)
	{
		int j_x = sort_rect[j].x;
		int i_x = sort_rect[i].x;
		if (j_x < i_x)
		{
			Mat temps = img_mat[i];
			img_mat[i] = img_mat[j];
			img_mat[j] = temps;
		}
	}
}

 加载模板,模板是自己准备的,可以自己画一张0123456789,然后根据查找轮廓和外接矩形截取roi存起来,存起来后,我们再建立一个容器存储模板图片,注意这个模板图片也是需要转灰度二值化处理,方便匹配识别

vector<Mat> myTemplate; //模板容器
for (int i = 0; i < 10; i++)
{
	string name = format("%d.png", i);
	Mat temp = imread(name);
	cvtColor(temp, temp, COLOR_BGR2GRAY);
	threshold(temp, temp, 100, 255, THRESH_BINARY);
	myTemplate.push_back(temp);
}

opencv简易数字识别

最后就是模板匹配了,匹配的方式有很多种,这里采用的是对数字和模板进行像素点的匹配,根据相同像素点的百分占比来得出结论,相同像素点越多,说明匹配相似度越高,最后以匹配程度最高的作为最终识别结果

double compare(Mat &img, Mat &temp)               
{
	Mat my_temp;
	resize(temp, my_temp, img.size());
	int rows, cols;
	uchar *img_point, *temp_point; //像素类型uchar
	rows = my_temp.rows;
	cols = my_temp.cols*img.channels();
	double result, same = 0.0, different = 0.0;
	for (int i = 0; i < rows; i++)       //遍历图像像素
	{
        //获取像素值
		img_point = img.ptr<uchar>(i); 
		temp_point = my_temp.ptr<uchar>(i);
		for (int j = 0; j < cols; j++)
		{
			if (img_point[j] == temp_point[j])
				same++;         //记录像素相同的个数
			else
				different++;    //记录像素不同的个数
		}
	}
	result = same / (same + different);
	return result;                     //返回匹配结果
}
vector<int> seq;//顺序存放识别结果
for (int i = 0; i < img_mat.size(); i++)
{
	double com = 0;
	double min = 0;
	int min_seq = 0;//记录识别结果
	for (int j = 0; j < myTemplate.size(); j++)
	{
		com = compare(img_mat[i], myTemplate[j]);
		if (com > min)
		{
			min = com;
			min_seq = j;
		}
		com = 0;
	}
	seq.push_back(min_seq);
}
//输出结果
cout << "识别结果为:";
for (int i = 0; i < seq.size(); i++)
cout << seq[i];
	

识别结果,正确识别,即使缩放大小也一样能识别成功

opencv简易数字识别

opencv简易数字识别

以上就是opencv简易的数字识别

喜欢的话就点个赞吧~

点赞收藏关注就是对我最大的支持~文章来源地址https://www.toymoban.com/news/detail-453159.html

到了这里,关于opencv简易数字识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中使用opencv LED屏数字识别(可用做车牌识别,一样的原理)

    应项目要求需要基于cpu的LED数字识别,为了满足需求,使用传统方法进行实验。识别传感器中显示的数字。因此使用opencv的函数做一些处理,实现功能需求。 首先读取图像,因为我没想大致得到LED屏幕的区域,因此将RGB转换为HSV空间,并分别设置H、S和V的阈值,让该区域显现

    2024年02月06日
    浏览(47)
  • opencv实战---使用TesseractOCR进行文字识别

    什么是tesseractOCR? TesseractOCR 是一款由HP实验室开发由 Google 维护的开源 OCR(Optical Character Recognition , 光学字符识别)引擎。 简单点说,就是用来做字符识别的,可以识别超过100种语言。也可以用来训练其他的语言。 听起来不错,但识别的准确率让人恼火。于是,有人训练出

    2024年02月04日
    浏览(37)
  • 人脸识别实战:使用Python OpenCV 和深度学习进行人脸识别

    首先简要讨论基于深度学习的面部识别的工作原理,包括“深度度量学习”的概念。 然后,我将帮助您安装实际执行人脸识别所需的库。 最后,我们将为静止图像和视频流实现人脸识别。 安装人脸识别库 ================================================================== 为了使用 Python 和

    2024年04月09日
    浏览(91)
  • Python使用Opencv进行图像人脸、眼睛识别实例演示

    效果展示 下面使用 haarcasecade_eye.xml 进行人眼识别的效果图: 人脸识别是一种可以自动检测图像或视频中存在的人脸的技术。它可以用于各种应用,例如安全控制,自动标记照片和视频,以及人脸识别解锁设备等。在这篇博客中,我们将详细讨论人脸识别技术,以及如何使用

    2023年04月17日
    浏览(58)
  • 简易版人脸识别qt opencv

    1、配置文件.pro 2、头文件 3、源文件 main.app widget.cpp 4、ui界面

    2024年02月09日
    浏览(40)
  • 基于OpenCV的简易实时手势识别(含代码)

    这是我大一寒假时写着玩的,非常简陋。基于凸包检测,所以实际上是计算指尖数量判断1~5的手势。又为1 ~3手势赋了控制鼠标操作的功能(但不能移动鼠标,而且因为手势识别不太准确所以这个功能实现得很废/doge)。(才疏学浅,希望有生之年能写个更好的 版本信息:Vi

    2024年02月03日
    浏览(52)
  • 使用C++和OpenCV进行人脸识别,包含模型训练与调用过程

    人脸识别是计算机视觉领域的一个重要应用,可以用于安全系统、人脸解锁和人脸表情分析等方面。本教程将向您展示如何使用C++和OpenCV库实现基本的人脸识别功能。我们将分为两部分,首先是模型训练过程,然后是调用过程。 安装OpenCV和C++开发环境: 在开始之前,请确保

    2024年02月09日
    浏览(47)
  • 使用 OpenCV 进行基于 ESP32 CAM 的目标检测和识别

      本教程介绍了使用 OpenCV 基于 ESP32 CAM 的目标检测和识别主题。OpenCV 是一个开源的图像处理库,不仅在工业界而且在研发领域都得到了非常广泛的应用。 这里对于对象检测,我们使用了cvlib 库。该库使用 COCO 数据集上的预训练 AI 模型来检测对象。预训练模型的名称是 YOLO

    2024年02月08日
    浏览(128)
  • OpenCV for Unity使用深度学习神经网络进行图像识别对象检测

    本文使用的是OpenCV for Unity 2.4.5 1.打开AssetsOpenCVForUnityStreamingAssetsdnnsetup_dnn_module.pdf 2.按照提示下载person.jpg、yolov4-tiny.cfg、yolov4-tiny.weights、coco.names  3.打开场景AssetsOpenCVForUnityExamplesMainModulesdnnYoloObjectDetectionExampleYoloObjectDetectionWebCamTextureExample.unity 4. 配置Dnn参数  5.运行

    2024年02月12日
    浏览(58)
  • 数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测

    目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载  地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键,选择“链接另存为”,选择代码所在的路径即可,就可以下载这个文件啦

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包