OpenCV项目实战日志——检测文字并对比识别

opencv文字识别 要在OpenCV中实现文字识别,您可以使用Tesseract OCR(光学字符识别)引擎。要使用Tesseract和OpenCV进行文字识别,您需要先安装Tesseract和Python的pytesseract库。接着,我们对灰度图进行了二值化处理,以便Tesseract能更好地识别文本。最后,我们使用Tesseract对二值化后的图像进行了文字识别,并打印出了识别结果。需要注意的是,这个示例使用的是简体中文(lang='chi_sim')进行识别。# 使用Tesseract OCR进行文字识别。 阅读详情

第一次写长博,记录一个项目。这几天一直在接小活,有一个是客户的要求是将目标图片上的文字(目测是好多器材上边的编号)检测出来,并对比,要求长字符串和长字符串相同,短字符串和短字符串相同,不一样的需要标识出来。感觉还挺有意思的,就把过程贴出来以便日后复习。话不多说先贴图:待检测图片和最终识别结果如下图,相同的长字符串用蓝色框标出,短字符串用绿色框标出,而疑似不一致字符串用红色框标出,对客户传来的待测试图片集检测效果良好。

基本上随着现在OCR技术的不断拓展和文字处理技术的不断上升,这个问题应该已经不算是问题,在这里梳理一下大致思路,其中为了锻炼自己对图像处理的理解,除了二值化的的函数和拟合最小包络矩形之外,都没用什么API。

0.具体思路的确定

根据具体问题的特殊性和与车牌检测的相区别(车牌检测的重要一步是车牌有矩形外边框因而容易确定文字所在范围,这类问题没有很明显的文字定位标志),通过不断试错确定了以下思路:

  1. 灰度+自适应性局部二值化
  2. 图像膨胀+简单滤波
  3. 八连通域检测
  4. 连通域筛选滤波
  5. 搜索确定字符串区域(由若干连通域组成)
  6. 基于形心的字符串角度最小二乘检测(兼排除噪声)
  7. 确定字符穿ROI
  8. ROI图像处理
  9. 基于Tesseract4.0的深度学习OCR文字识别
  10. 处理识别出的字符串,判断非一致项,并将结果在原图中标出。

下面对仅重要步骤作详细说明:

1.关于二值化的说明

客户提供的图片文字和背景对比度很高,一开始以为二值化是个小事,但后来发现并非如此。在一开始二值化过程中分别采取了以下几种方案:定值的全局二值化、分块OTSU局部二值化以及最终采用的自适应局部二值化(adaptiveThreshold)。定值的全局二值化的问题在于图像的适应性很差,对于一张图像而言可能存在一个最佳阈值可能是确定的,但是多张图片受光线影响较重;为了解决光线的问题,采取了分块OTSU局部二值化的方法,这个函数是自己写的,可以选择块的大小,并对每个块进行OTSU二值化,但是这个方法的问题在于,OTSU是为区分图片的前景和背景而存在,但在本问题中,文字部分可不仅仅是”前景“那么简单,换句话说,通过OTSU后,不仅文字部分——好多灰度高于大约40的部分都被划分为前景,这对后边滤波和连通域的分析都带来极大的困难,一方面是引入很多噪声,另一方面各个字符之间的区域也被识别为白色,无法分开,但是这一步也不是白做的,引入的思考:一个比较好的想法就是,既然OTSU得出来的阈值不够”高“,那么如果我们在OTSU所得到的基础上,加上一个”合适的数“,使最终的结果作为二值化的阈值,那问题不就解决了?这个其实想法也可以在自己的函数上实践,但是最后直接用了adaptiveThreshold,这个函数最终的两个参数分别是分块的”块的大小“以及”最终加上的那个值“,用了这个函数以后可以很好的区分文字部分和非文字部分,避免引入尽量少的噪声;关于”块的选取“,本例中前景和背景区分明确,应该使块”尽量大“以忽略诸多细节(这些细节就体现在文字与文字之间相连的部分),而”加上的值“要尽量大,即二值化的”要求要尽量高“。最终二值化的结果展现如下 :可以发现除了少部分星星点点的噪声以外效果还是很好的。

2. 图像膨胀+中值滤波

这一步没什么可说的,只有关于图像膨胀的必要性说明:有一些独立字符在二值化之后分开了,如大写的K的一竖和右边的部分就分开了,分成了两个连通域,这是不好的,因为后边还会对字符串内连通域的个数进行统计,因此用dilate对白色区域进行膨胀。

3. 八连通域检测

网上关于连通域的检测教程有很多,也有很多源码,这里就不赘述了,详情请看https://blog.youkuaiyun.com/ShanX_s/article/details/52860896,讲的很生动,也有代码。

但是源码大多是四联通域的,我自己写了个八连通域的(两遍法),贴出来分享给大家。关于四联通域和八连通域的区别在于,四联通域两边比较的对象都是上像素和左像素,但八连通域比较对象扩充到了:上像素、左像素、上左像素、和上右像素,同时处理的时候仍然要像素越界的问题。另一个比较坑的地方就是,labelImg一定要是long int格式,因为我的图像实在是太大了(4000*13000),只有一个int根本储存不过来,不然会出现用完了又来一遍,这就比较坑了,因为他不会报错,但一个连通域又被分成了两个!!!让我检查了好久到底是哪里出了问题。

bool FindConnectedDomain(Mat& srcImg, Mat& labelImg)
{
	if (srcImg.empty())
	{
		cerr << "Invalid input parameters! " << endl;
		return false;
	}
	if (srcImg.channels() != 1)
	{
		cerr << "Please input a binary image!" << endl;
		return false;
	}
	labelImg = Mat(srcImg.size(), CV_32SC1, Scalar(0));
	vector<long int> labelSet;
	labelSet.push_back(0);
	int flag = 0;
	//第一遍扫描
	for (int row = 0; row < srcImg.rows; row++)
	{
		uchar* currentPtr = srcImg.ptr<uchar>(row);
		uchar* lastPtr = srcImg.ptr<uchar>(max(0, row - 1));
		long int* currentDstPtr = labelImg.ptr<long int>(row);
		long int* lastDstPtr = labelImg.ptr<long int>(max(0, row - 1));
		for (int col = 0; col < srcImg.cols; col++)
		{
			if (currentPtr[col] == 255)
			{
				//四联通域
				//if (currentDstPtr[max(0,col-1)] == 0 && lastDstPtr[col] == 0)
				//{
				//flag++;
				//currentDstPtr[col] = flag;
				//labelSet.push_back(flag);
				//}
				//else if (currentDstPtr[max(0, col-1)] == 0 && lastDstPtr[col] != 0)
				//{
				//	currentDstPtr[col] = lastDstPtr[col];
				//}
				//else if (currentDstPtr[max(0, col-1)] != 0 && lastDstPtr[col] == 0)
				//{
				//	currentDstPtr[col] = currentDstPtr[max(0, col-1)];
				//}
				//else if (currentDstPtr[max(0, col-1)] != 0 && lastDstPtr[col] != 0)
				//{
				//	int upperLabel = labelSet[lastDstPtr[col]];
				//	int leftLabel = labelSet[currentDstPtr[max(0, col-1)]];
				//	int biggerLabel = max(upperLabel, leftLabel);
				//	int smallerLabel = min(upperLabel, leftLabel);
				//	currentDstPtr[col] = smallerLabel;
				//	labelSet[biggerLabel] = smallerLabel;
				//}

                                //八连通域
				if (currentDstPtr[max(0, col - 1)] == 0 && lastDstPtr[col] == 0 && lastDstPtr[max(0, col - 1)] == 0 && lastDstPtr[min(col + 1, srcImg.cols - 1)] == 0)
				{
					flag++;
					currentDstPtr[col] = flag;
					labelSet.push_back(flag);
				}
				else
				{
					int leftLabel = labelSet[currentDstPtr[max(0, col - 1)]];
					int upLabel = labelSet[lastDstPtr[col]];
					int upLeftLabel = labelSet[lastDstPtr[max(0, col - 1)]];
					int upRightLabel = labelSet[lastDstPtr[min(col + 1, srcImg.cols - 1)]];
					int tempLabel = max(max(max(leftLabel, upLabel), upLeftLabel), upRightLabel);

					int smallestLabel = min(tempLabel, leftLabel);
					if (smallestLabel == 0) smallestLabel = tempLabel;
					if (smallestLabel != 0) tempLabel = smallestLabel;

					smallestLabel = min(tempLabel, upLabel);
					if (smallestLabel == 0) smallestLabel = tempLabel;
					if (smallestLabel != 0) tempLabel = smallestLabel;

					smallestLabel = min(tempLabel, upLeftLabel);
					if (smallestLabel == 0) smallestLabel = tempLabel;
					if (smallestLabel != 0) tempLabel = smallestLabel;

					smallestLabel = min(tempLabel, upRightLabel);
					if (smallestLabel == 0) smallestLabel = tempLabel;
					if (smallestLabel != 0) tempLabel = smallestLabel;

					currentDstPtr[col] = smallestLabel;
					if (leftLabel != 0)
					{
						labelSet[leftLabel] = smallestLabel;
					}
					if (upLabel != 0)
					{
						labelSet[upLabel] = smallestLabel;
					}
					if (upLeftLabel != 0)
					{
						labelSet[upLeftLabel] = smallestLabel;
					}
					if (upRightLabel != 0)
					{
						labelSet[upRightLabel] = smallestLabel;
					}
				}
			}
		}
	}

	//第二遍扫描
	for (int row = 0; row < labelImg.rows; row++)
	{
		int* currentRow = labelImg.ptr<int>(row);
		for (int col = 0; col < labelImg.cols; col++)
		{
			if (currentRow[col] == 0) continue;
			int oldLabel = currentRow[col];
			while (currentRow[col] != labelSet[oldLabel])
			{
			currentRow[col] = labelSet[oldLabel];
			oldLabel = currentRow[col];
			}
		}
	}
	return true;
}

4. 连通域筛选滤波

自己创建的连通域结构体如下ConnectedDomain,包含了所有像素位置,像素的边界坐标(用来以后确定最小正矩形),连通域大小以及连通域的形心(用来以后最小二乘文字角度用)。

struct ConnectedDomain
{
	int label;
	vector<PixelPoint> pixelGroup;
	int xMax;
	int xMin;
	int yMax;
	int yMin;
	long int xSum;
	long int ySum;
	Point2d center;
	int area;
};

而对于从labelImg转换到vector<ConnectedDomain>的过程需要经历面积大小的筛选,最小包络正矩形长宽大小以及长宽比的筛选,以及最小包络矩形的面积筛选。这里说明一下:最小包络正矩形指的是横平竖直的矩形,也就是结果图上画出来的那种,直接由连通域的xMax,xMin,yMax,yMin组合即可确定矩形顶点;最小包络矩形是用的API:cv::minAreaRect,值得一提的是,在大多数教材中minAreaRect是连在findContours后边用的,用于对轮廓检测最小矩形,但是实际上他的输入参数是InputArray,vector是他的基类之一,我们用vector<Point>类型的对象都可以作为形参传进去(InputArray真是强大,各种数据通吃)。代码段和八连通域最终滤波后的图像如下(花花绿绿的还挺好看):

	for (vector<ConnectedDomain>::iterator it = connectedDomainGroup.begin(); it != connectedDomainGroup.end(); )
	{
		if (it->area < 200 || it->area > 2000 || (it->xMax - it->xMin) > 50 || (it->yMax - it->yMin) > 50)
		{
			it = connectedDomainGroup.erase(it);
			continue;
		}

		vector<Point> pointGroup;
		for (unsigned int i = 0; i < it->pixelGroup.size(); i++)
		{
			pointGroup.push_back(Point(it->pixelGroup[i].col, it->pixelGroup[i].row));
		}
		RotatedRect rect = minAreaRect(pointGroup);
		Size mySize(rect.size);
		if (mySize.width < 5 || mySize.height < 5)
		{
			it = connectedDomainGroup.erase(it);
			continue;
		}
		it->center.x = (double)(it->xSum) / (double)(it->pixelGroup.size());
		it->center.y = (double)(it->ySum) / (double)(it->pixelGroup.size());
		it++;

	}

5.确定字符区域

连通域都弄好了,接下来就要确定字符区域,我创建的字符结构体如下,成员包括连通域向量,包络正矩形和文字的倾斜角度(以后仿射变换用的):

struct CharacterGroup
{
	int xMax;
	int xMin;
	int yMax;
	int yMin;
        double angle;
	PixelPoint xMax_yMax;
	PixelPoint xMax_yMin;
	PixelPoint xMin_yMax;
	PixelPoint xMin_yMin;
	vector<ConnectedDomain> relatedConnectedDomain;
	
};

确定字符串的条件是:连通域之间相距小于设定阈值的彼此属于同一字符,这就带来一个坏处就是,假设在一堆文字联通域中出现了一个滤波没滤掉的坏连通域,那么他一并会被列入相关字符串并参与后续运算,针对此我们在第六步进行了最小二乘噪声剔除。

6.确定文字角度

确定文字角度的方法是对所有属于一个字符串的连通域进行最小二乘拟合直线,通过对拟合直线的斜率进行atan就能得到文字角度,这些都是为了后续仿射变换做准备(放射变换是为了将文字调正,为了OCR做准备)至于最小二乘是如何去除噪声的呢,这个就仁者见仁了,我也卖个关子,不在这里说。最后也可以引入一点回环检测的思想,因为基本上所有文字都是平行的,可以对所有字符串的角度进行统计,一般都是74°小数点后一两位不确定,对于相差太多的字符串肯定是有噪声影响,那么我们就可以处理一下巴拉巴拉。贴上最小二乘的代码,浅显易懂不必说明。

void LineFitLeastSquares(vector<float>& data_x, vector<float>& data_y, int data_n, vector<float> &gradient, vector<float> &intercept, vector<float> &r2)
{
	float A = 0.0;
	float B = 0.0;
	float C = 0.0;
	float D = 0.0;
	float E = 0.0;
	float F = 0.0;

	for (int i = 0; i<data_n; i++)
	{
		A += data_x[i] * data_x[i];
		B += data_x[i];
		C += data_x[i] * data_y[i];
		D += data_y[i];
	}

	// 计算斜率a和截距b
	float a, b, temp = 0;
	if (temp = (data_n*A - B*B))// 判断分母不为0
	{
		a = (data_n*C - B*D) / temp;
		b = (A*D - B*C) / temp;
	}
	else
	{
		a = 1;
		b = 0;
	}

	// 计算相关系数r
	float Xmean, Ymean;
	Xmean = B / data_n;
	Ymean = D / data_n;

	float tempSumXX = 0.0, tempSumYY = 0.0;
	for (int i = 0; i<data_n; i++)
	{
		tempSumXX += (data_x[i] - Xmean) * (data_x[i] - Xmean);
		tempSumYY += (data_y[i] - Ymean) * (data_y[i] - Ymean);
		E += (data_x[i] - Xmean) * (data_y[i] - Ymean);
	}
	F = sqrt(tempSumXX) * sqrt(tempSumYY);

	float r;
	r = E / F;

	gradient.push_back(a);
	intercept.push_back(b);
	r2.push_back(r*r);
}

7&8.确定字符串ROI并做相关图像处理

上边都确定了字符串最小包络正矩形了,当然可以对原图选取ROI,在ROI选取后对ROI做的处理有adaptiveThreshold啦、滤波啦、放射变换啦等等,最后处理出来的是这个样子的,交给Tesseract就会省心的多啦!

9.基于Tesseract的OCR

我的IDE是VS2015,编译环境release+32,配置Tesseract详见这位网友大大的救命博文https://blog.youkuaiyun.com/andylanzhiyong/article/details/81807425,真是服了,这个配置花了我两天时间,需要用cmake对tesseract和cppan生成项目再编译,以前只用过cmake逆向OpenCV源码和配置Eigen以及SSBA,结果这次中间遇到各种bug各种找不到文件。另注:使用的数据集是Google官方提供的eng.traineddata。

10.对检测出的字符串进行处理

这一步主要是针对人为可见的误识别,如”S“识别成了”$”等,几个if就解决了。最终识别效果还是挺好的,小项目也没有必要去自己训练一份数据。识别结果如下:

 

 

OpenCV练手项目指南:从环境搭建到车牌识别实战 计算机视觉学习过程中,很多人卡在会看API却不会做项目的阶段。OpenCV作为图像处理的核心工具,其价值不仅在于函数调用,更在于如何将边缘检测、形态学、轮廓分析等基础技术组合成完整解决方案。从Python与C++的环境配置到CUDA加速判断,从图像预处理到YOLO模型接入,每一环节都决定项目能否真正落地。车牌识别、目标检测、文档矫正等综合项目之所以适合课设与毕设,正是因为它们覆盖了从图像读取到结果输出的完整链路。掌握最小外接矩形矫正、透视变换、轮廓过滤等技巧,再配合规范的工程目录与量化测试,就能把练手项目升 阅读详情

相关推荐

Dlib与OpenCV实现人脸关键点检测与表情识别

人脸关键点检测是计算机视觉中的基础技术,通过定位面部特征点实现表情分析、姿态估计等功能。其核心原理是利用级联回归算法逐步修正关键点位置,结合形状索引特征提升检测精度。Dlib库提供了高效的68点检测模型,配合OpenCV的图像处理能力,可在普通CPU上实现实时处理。该技术在智能客服、疲劳驾驶监测等场景具有广泛应用价值。项目中通过多尺度检测和关键点平滑处理优化性能,并解决了模型加载、摄像头访问等常见工程问题。

weixin_30843605的博客 522

推荐几个Python+OpenCV实战项目

计算机视觉 (CV) 是人工智能 (AI) 的一个分支,它使计算机能够从图像、视频和其他视觉输入中提取有意义的信息。例如自动驾驶汽车、自动交通管理、监控、基于图像的质量检查等等。有不少粉丝问CVer:本人小白一枚,看了很多深度学习,机器学习以及图像处理等视频和书之后,理论有一些长进,但是实际运用能力不足,从反面也是由于理论认识不足所致,所以想问问有没有好的项目,提升下自身...

阿木寺的博客 7090

Opencv项目实战:00 专栏内容介绍

Opencv项目实战,持续更新中。如今更新到 25 车道线检测

m0_62919535的博客 2312

20个OpenCV案例,让你了解计算机视觉的广泛应用!

本文介绍了20个关于OpenCV的案例,包括人脸识别、目标检测、图像分割、光流估计、特征提取、图像拼接、图像修复、图像变换、图像配准、视频分析、三维重建、图像处理、图像识别、文字识别、图像压缩、图像增强、图像分析、图像比对、图像转换和图像特效。这些案例展示了OpenCV在计算机视觉领域的广泛应用,可以帮助读者了解OpenCV的功能和应用场景,同时也为读者提供了一些灵感和启示,可以在自己的项目中应用OpenCV进行图像处理和分析。

qq_28245087的博客 1万+

Opencv项目实战:12 你这背景太假啦!

《Opencv项目实战:12 背景板移除和替换》平常我们在各个平台,比如某音、B站、小红薯等,有这么一群创作者——虚拟人物、带有各种背景板的创作者,前段时间还玩出了一个“我的背景板假吗?”这样的梗,那么我们今天要制作的是更改我们的背景板,将原有的去除,添加上新的背景板,并可以通过敲击键盘对背景板进行切换(本项目中,‘q’表示-1,‘w’表示+1)。感兴趣的不妨收藏起来吧!!

m0_62919535的博客 9786

基于OpenCV的中国象棋识别与棋谱定位完整项目实战

计算机视觉领域,图像识别与模式匹配是基础而重要的方向。OpenCV作为经典开源库,提供了丰富的图像处理工具,无需训练即可实现目标检测与识别。通过边缘检测、透视变换矫正棋盘视角,利用霍夫圆检测定位棋子中心,再借助模板匹配判别棋子类型与颜色,构成了完整的传统视觉识别流程。该方案依赖少、CPU可实时运行,非常适合课程设计与工程实践。结合中国象棋场景,不仅能静态识别棋子布局,还能通过帧间对比生成规范棋谱,为对弈记录、残局分析提供自动化支持。本文以基于OpenCV的象棋识别与棋谱定位为例,拆解从图像预处理到棋谱输出的

weixin_34221036的博客 390

opencv计算机视觉--PaddleOCR的实时多语言文本检测与识别

OCR(光学字符识别)技术通过计算机视觉和机器学习算法,将图像中的文字转换为可编辑文本。其处理流程包括图像预处理、文字检测、识别和后处理四个阶段。本文详细介绍了基于PaddleOCR的实现方法,涵盖静态图片和实时视频中的中英文识别,特别针对中文显示问题提供了PIL库的解决方案。同时给出了性能优化建议(GPU加速、跳帧处理等)和常见问题解决方法,并探讨了多语言识别、结果保存等扩展应用场景。通过这套方案可构建完整的实时OCR识别系统,满足不同场景下的文字识别需求。

2301_77717128的博客 1318

OpenCV人脸识别实战:从Haar检测到LBPH模型训练全流程

图像处理是计算机视觉的重要基础,它通过像素级操作与特征分析让机器理解视觉信息。在众多应用中,人脸识别是最具代表性的落地场景之一,其核心链路涵盖人脸检测、特征提取与分类器训练。OpenCV作为开源计算机视觉库,提供了Haar级联检测与LBPH识别器等经典工具,让开发者无需深度学习也能完成实时人脸识别。本文从图像处理基础概念出发,梳理基于OpenCV的人脸识别实现路径,覆盖摄像头采集、样本数据集构建、模型训练、置信度阈值调参与常见错误排查,并通过可视化报告增强答辩说服力,帮助初学者快速掌握一套可运行的工程方案。

weixin_34245082的博客 317

轻松实现多语言文字识别与实时检测:PaddleOCR 实战指南

本文系统介绍了百度PaddleOCR工具库的核心功能与应用实践。作为基于飞桨框架的轻量级OCR解决方案,PaddleOCR具备多语言支持、角度自适应和高精度识别等特点。文章通过三个典型场景演示:静态图片多语言识别(日语示例)、OpenCV可视化标注(英文示例)以及摄像头实时中文检测,详细解析了API调用、结果解析、坐标转换等关键技术点,并针对中文显示问题提供了Pillow库的解决方案。这些案例覆盖了文档数字化、智能物流等实际应用场景,为开发者快速实现OCR功能提供了实用参考。

纤纡.的博客 1021

OpenCV人脸识别系统实战:从LBPH算法到实时部署

人脸识别作为计算机视觉的核心应用,其原理基于特征提取与模式匹配。传统方法如Haar级联和LBPH算法,通过分析图像纹理和结构特征实现身份验证,为轻量级应用提供了高效解决方案。在工程实践中,OpenCV作为开源视觉库,封装了这些经典算法,显著降低了开发门槛。其价值在于平衡性能与可解释性,尤其适合嵌入式设备和边缘计算场景。本文聚焦LBPH算法,结合实时人脸检测与数据采集,详解模型训练、参数调优及系统集成,为智能门锁、考勤系统等应用提供完整实现路径。

weixin_34221773的博客 441

智能气象站:ESP32驱动的心知天气数据可视化实践

本文详细介绍了基于ESP32微控制器和心知天气API构建智能气象站的完整实践。通过Arduino开发环境,实现天气数据的获取、JSON解析与OLED屏可视化展示,涵盖硬件连接、API配置、低功耗优化及部署问题排查,为物联网开发者提供实用指南。

jump7的博客 210

OpenCV实战项目全解析:从信用卡识别到目标追踪的四个经典案例

图像处理与计算机视觉是人工智能领域的基础方向,而OpenCV作为最流行的开源视觉库,为开发者提供了从像素操作到视频流分析的完整工具箱。掌握OpenCV不仅意味着熟悉各类API,更关键在于理解如何将形态学操作、边缘检测、模板匹配等基础算子组合成解决实际业务问题的技术链路。以信用卡识别、文档扫描、疲劳检测、目标追踪四个企业级项目为例,详细展示传统图像处理与视频分析的核心原理及工程实践方法,涵盖轮廓提取、透视变换、人脸关键点检测和多目标追踪等关键技术。这些场景广泛应用于金融卡面识别、办公文档矫正、驾驶行为监测和智

weixin_34197488的博客 392

三相Vienna整流器过零点电流畸变?试试这个SVPWM调制波补偿技巧

本文针对三相Vienna整流器在电流过零点附近出现的电流畸变问题,提出了一种基于SVPWM调制波补偿的有效解决方案。该方法通过注入零序分量重构占空比,巧妙解决因拓扑约束导致的调制矛盾,在基本不增加计算复杂度的前提下,显著平滑电流波形,降低THD。

weixin_29212867的博客 114

OpenCV练手项目合集:100个实战项目从入门到综合系统

计算机视觉作为人工智能的重要分支,其核心任务之一是通过图像处理技术让机器理解视觉信息。OpenCV正是这一领域最常用的开源工具库,它提供了从基础图像读取、颜色空间转换、边缘检测,到特征提取、目标检测、深度学习模型推理等一系列能力。对于学习者、课程设计或求职者而言,真正掌握OpenCV的价值不在于调用几个API,而在于能完成一个完整的图像处理流程:输入、预处理、特征提取、模型推理、后处理与输出。这套OpenCV练手项目合集覆盖了图像基础处理、特征检测、视频实时分析、机器学习结合以及综合实战系统五个层次,并给出

weixin_34280237的博客 305

MAX31865三线PT100测温实战:配置、接线与代码全解析

本文详细解析MAX31865三线PT100测温的配置、接线与代码实现。通过实战经验分享,介绍如何利用MAX31865芯片实现高精度温度测量,重点讲解三线制接法的自动误差补偿功能,并提供完整的寄存器配置、SPI通信和温度转换算法,帮助开发者快速解决工业测温中的常见问题。

ss78901的博客 757

自己动手写CPU(1)五级流水线及CPU第一条指令ori

自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh。正好之前看到一本《自己动手写CPU》,就按照此书从头实做一遍MIPS指令集的CPU,也当做对大学课程的总结。之前看龙芯杯比赛的代码震惊到我了,想想那堆大佬本科在搞这东西而我本科在瓜瓜地刷分,感叹人之间的差距真的好大。痛定思痛,还是先动手做起来这才能假意安慰自己,我好像也不错。闲言少叙,让我们开始吧! 由于作者提供了各章实现的具体代码,所以该系列博客主要记录我过程中有哪些

谦豫 7077

OpenCV图像区域识别与提取:Python实战二维码检测完整指南

图像区域识别是计算机视觉中的基础技术,通过边缘检测和轮廓分析原理,能够自动定位图像中的特定目标区域。这项技术的核心价值在于为后续的图像分析、目标识别等任务提供精确的定位基础。在实际应用中,图像区域识别广泛应用于文档扫描、工业质检、智能裁剪等场景。本文基于OpenCV和NumPy库,重点讲解图像预处理、轮廓检测、区域筛选等关键技术环节,通过完整的二维码识别实战案例,展示如何实现高效的图像区域提取。项目中涉及的批量处理和多尺度检测技术,为处理证件照、产品图等实际需求提供了可靠的工程解决方案。

weixin_34290631的博客 536

MTK metadata中AF模块的移除与配置调整

本文详细介绍了在MTK平台Camera开发中如何移除metadata中的AF(自动对焦)模块。通过系统清理MTK_CONTROL_AF_REGIONS、MTK_CONTROL_MAX_REGIONS等关键配置项,并调整对焦模式及硬件特性声明,确保定制化设备在禁用自动对焦功能后的稳定运行。

q1w3e5r7t9y的博客 570

5分钟部署OCR文字检测模型,科哥镜像让文档识别超简单

本文介绍了如何在星图GPU平台上自动化部署cv_resnet18_ocr-detection OCR文字检测模型 构建by科哥镜像,快速实现文档图像中的文字检测与坐标提取。用户无需配置环境或编写代码,通过Web界面上传发票、合同等图片,即可获取结构化文本及标注框,适用于财务报销、合同处理等办公自动化场景。

weixin_35266799的博客 684

数学建模学习(120):使用Python实现基于AHP的供应商选择分析

使用Python实现基于AHP的供应商选择分析

全栈川川 911

【ArcGIS微课1000例】0118:一文讲清楚tif(geotiff)栅格数据格式

TIFF(Tagged Image File Format)是一种常见的图像文件格式,它被广泛用于存储和传输各种类型的图像数据。图像存储:TIFF格式可以存储多通道的位图图像,包括灰度图、彩色图和透明度图等。它支持不同的像素深度,可以是8位、16位、24位或32位等。因此,TIFF格式非常适合存储高质量的图像数据,包括照片、卫星图像、医学影像等。无损压缩:TIFF格式支持无损压缩,这意味着图像可以被压缩而无需损失任何像素信息。这种压缩方式可以减小文件大小,而不会降低图像的质量。

智慧空间实验室 2819

零基础入门OCR文字检测,用科哥镜像轻松实现单图识别

本文介绍了如何在星图GPU平台上自动化部署cv_resnet18_ocr-detection OCR文字检测模型(构建by科哥),快速实现印刷体图文的单图文字检测与结构化提取。用户无需配置环境,5分钟内即可完成发票、网页截图、合同图片等场景下的文字定位、识别及坐标导出,显著提升文档数字化效率。

weixin_35826166的博客 318

Arduino读取串口接收到的数据并发送数据

Arduino读取串口接收到的数据并发送数据 源程序: void setup() { Serial.begin(115200); } void loop() { String comdata ; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } if (comdata.length() > 0) { Serial.print("串口接收到的数据:"); Serial.println(comd

perseverance51博客 1万+

【PaddleOCR实战指南:图像文字识别、实时摄像头与PyQt5 GUI开发】

配置环境。

m0_74373135的博客 530

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于 PaddleOCR+OpenCV 实现图片 / 实时视频文字识别

本文介绍了基于PaddleOCR的文字识别实现方法,包括静态图片和实时视频流两种场景。首先概述了核心工具库:PaddleOCR(多语言OCR识别)、OpenCV(图像处理)和NumPy(坐标转换)。静态图片识别部分详细说明了初始化配置、图像读取、结果解析和可视化绘制流程,特别强调了坐标转换和判空处理等关键点。视频流识别部分则讲解了摄像头读取、帧处理、实时标注和资源释放等注意事项。文中还提供了GPU加速的使用建议和常见问题的解决方案,为开发者提供了完整的OCR应用实现指南。

lyx2870657588的博客 310

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OCR文字识别部署实战:基于CRNN模型的开源镜像快速上手指南

高精度识别:CRNN模型在中文场景下优于传统轻量模型零依赖部署:Docker一键启动,无需GPU,兼容各类硬件双模交互:WebUI直观易用,API便于集成智能预处理:OpenCV增强算法提升低质图像识别率工业可用性:已在多个实际项目中验证稳定性无论是学生、开发者还是企业用户,都可以通过这个镜像快速获得一个可靠、高效的OCR能力入口。🔗 下一步建议:尝试将其接入自动化办公系统、文档管理系统或移动端App,真正实现“拍图即识字”的智能体验。如需获取完整源码或参与社区贡献,请访问。

weixin_42604188的博客 881

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 亡羊补牢——关于waitKey(0)不起作用的问题
下一篇: 亡羊补牢——C2632: “char”后面的“int”非法
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值