【OpenCV】基于轮廓的字符分割

news/2024/7/21 6:51:34 标签: OpenCV, 图像处理
vector<IplImage*>  mycvCharSegment(IplImage* image)
{  //此函数利用OpenCV中的cvFindContours找出字符的轮廓后进行字符分割,包括汉字的合并处理,但是要求二值化的图像轮廓清晰
	vector<IplImage*> characters;  //存储分割出来的字符的图像头

	IplImage* smoothImg = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
	cvSmooth(image, smoothImg, CV_MEDIAN, 3, 3, 0, 0);
	/*cvNamedWindow("Smooth", CV_WINDOW_AUTOSIZE);
	cvShowImage("Smooth", smoothImg);*/

	IplImage* contoursImg = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
	cvCopy(smoothImg,contoursImg);
	CvSeq* contours = NULL;  
        CvMemStorage* storage = cvCreateMemStorage(0);  
	int count = cvFindContours(smoothImg, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL); 

	vector<CvRect> rcs;
	vector<CvRect> comrcs;
	for ( CvSeq* c = contours; c != NULL; c = c->h_next ) 
	{
		CvRect rect = cvBoundingRect(c, 0);
		rcs.push_back(rect);
	}
	sort(rcs.begin(), rcs.end(), compareRect); //compareRect是自定义的一个比较函数
	vector<CvRect>::iterator itr,itr_next;

	float aveHeight = mycvGetRectAveHeight(rcs);  
	float aveWidth = mycvGetRectAveWidth(rcs);  
	float maxWidth = mycvGetRectMaxWidth(rcs);  
	float maxHeight = mycvGetRectMaxHeight(rcs); 

	for ( itr = rcs.begin(),itr_next=itr+1; itr != rcs.end(); ) 
	{
		CvRect rc = *itr;
		if(itr_next!= rcs.end())
		{
			CvRect rcnext = *(itr_next);

			if ( (rc.x+rc.width>rcnext.x)||((rc.x<rcnext.x) && (rc.x+rc.width>rcnext.x+rcnext.width)) ) 
			{
				rc.x = min(rc.x,rcnext.x);
				rc.y = min(rc.y,rcnext.y);
				rc.width = max((rc.x+rc.width),(rcnext.x+rcnext.width))-rc.x;
				rc.height = max((rc.y+rc.height),(rcnext.y+rcnext.height))-rc.y;

				*itr = rc; 
				itr_next++;
			}
			else
			{
				comrcs.push_back(rc);
				itr = itr_next++;  
			}
		}
		else
		{
			itr++;
			comrcs.push_back(rc);
		}
	}
	
	for ( itr = comrcs.begin(); itr != comrcs.end(); itr++ ) 
	{
		CvRect rc = *itr;
		cvDrawRect(image, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 255, 255));

		cvNamedWindow("字符分割", CV_WINDOW_AUTOSIZE);
		cvShowImage("字符分割", image);

		IplImage* imgNo = cvCreateImage(cvSize(rc.width , rc.height), IPL_DEPTH_8U, 1);
		cvSetImageROI(image, rc);
		cvCopyImage(image, imgNo);
		cvResetImageROI(image);
		cvResetImageROI(imgNo);

		IplImage* dst = cvCreateImage(cvSize(rc.width , rc.height), IPL_DEPTH_8U, 1);
		cvResize(imgNo, dst);
		characters.push_back(dst);
	}

	return characters;
}


http://www.niftyadmin.cn/n/781243.html

相关文章

sql timestep 秒数后6位_LatencyMon v 6.71 精确度最高的检查启动秒数后6位

最新版本&#xff1a;LatencyMon v 6.716.70版提供了一些重要的错误修复。LatencyMon检查运行Windows的系统是否适合处理实时音频和其他任务。LatencyMon通过测量内核计时器延迟并报告DPC和ISR执行时间以及硬分页错误来分析缓冲区不足的可能原因。它将提供一个可理解的报告&…

win7 32位安装python_Scrapy在win7 32位的安装及依赖包

Scrapy&#xff0c;一个网络爬虫的框架&#xff0c;首先第一步肯定是安装。参考网上的文章。安装过程中需要用到pip工具&#xff0c;请自行安装。1.安装python这个是必须的&#xff0c;既然都用到scrapy了&#xff0c;肯定已经安装了python,这个略过。2.安装pywin32下载地址&am…

【OpenCV】角点检测

#include <stdio.h> #include "cv.h" #include "highgui.h"#define MAX_CORNERS 100int main(void) { int cornersCountMAX_CORNERS;//得到的角点数目 CvPoint2D32f corners[MAX_CORNERS];//输出角点集合 IplImage *srcImage 0,*grayImage 0,*corn…

python中查询数据库个数_python django 数据库查询方法总结

__exact 精确等于 like ‘aaa’__iexact 精确等于 忽略大小写 ilike ‘aaa’__contains 包含 like ‘%aaa%’__icontains 包含 忽略大小写 ilike ‘%aaa%’&#xff0c;但是对于sqlite来说&#xff0c;contains的作用效果等同于icontains。__gt 大于__gte 大于等于__lt 小于__l…

jenkins 构建异常_时间序列异常检测算法

关键词&#xff1a;时间序列&#xff0c;异常值&#xff0c;outliter, anomaly我们一直在审查异常检测方法的前景&#xff0c;并根据这项研究完善我们的模型。 本文主要是回顾时间序列异常点检测的常用方法以及每个方法的优劣。 这篇文章专门针对那些只想了解异常检测技术当前状…

【OpenCV】How to Use Tesseract with C++ or OpenCV

说明&#xff1a;在使用Tesseract 之前&#xff0c;一定要安装好Tesseract &#xff0c;并在Project中配置好Tesseract 路径。 在自己的工程属性中VC目录下增加包含目录和库目录&#xff0c;以便VS2010查找文件。例如&#xff1a; 包含目录&#xff1a;新增C:\Program Files\…

python图片压缩软件_python 开发一款图片压缩工具(四):上传图床

上一篇使用了 pngquant 图片压缩工具进行压缩&#xff0c;并通过 click 命令行工具构建了 picom 包。这篇的主要功能是实现图片上传。图片上传功能的实现通过 pngquant 压缩图片后&#xff0c;得到一个 -fs8.png 为后缀的图片。想要把图片上传到云端&#xff0c;只需要把这个文…

python寻峰_python – 查找峰的全宽半个最大值

您可以使用样条曲线拟合[蓝色曲线 – 峰值/ 2],然后找到它的根&#xff1a;import numpy as npfrom scipy.interpolate import UnivariateSplinedef make_norm_dist(x, mean, sd):return 1.0/(sd*np.sqrt(2*np.pi))*np.exp(-(x - mean)**2/(2*sd**2))x np.linspace(10, 110, 1…