opencv文字区域的提取(vs2019 c++)
原理
我们是怎么做到检测到区域的呢?
首先,我们会注意到,文字区域和其他的图片背景很不一样。我们用膨胀处理图片,让文字变成一块块大区域,然后识别整块的轮廓,用矩形去框住这个轮廓。
这个程序分三个子函数,detect(检测),preprocess(图片预处理),findTextRegion(查找和筛选文字区域)。即main函数调用detect函数去实际完成文字区域检测。detect函数又分成preprocess和findTextRegion两个步骤来做。
#include<opencv2/opencv.hpp>
#include<iostream>
#include<opencv2/highgui/highgui_c.h>
#include<vector>using namespace cv;
using namespace std;Mat preprocess(Mat gray)
{//1.Sobel算子,x方向求梯度Mat sobel;Sobel(gray, sobel, CV_8U, 1, 0, 3);//2.二值化Mat binary;threshold(sobel, binary, 0, 255, THRESH_OTSU + THRESH_BINARY);//3.膨胀和腐蚀操作核设定Mat element1 = getStructuringElement(MORPH_RECT, Size(30, 9));//控制高度设置可以控制上下行的膨胀程度,例如3比4的区分能力更强,但也会造成漏检Mat element2 = getStructuringElement(MORPH_RECT, Size(24, 4));//4.膨胀一次,让轮廓突出Mat dilate1;dilate(binary, dilate1, element2);//5.腐蚀一次,去掉细节,表格线等。这里去掉的是竖直的线Mat erode1;erode(dilate1, erode1, element1);//6.再次膨胀,让轮廓明显一些Mat dilate2;dilate(erode1, dilate2, element2);//7.显示中间图片//imshow("binary.jpg", binary);//imshow("dilate1.jpg", dilate1);//imshow("erode1.jpg", erode1);//imshow("dilate2.jpg", dilate2);return dilate2;
}vector<RotatedRect> findTextRegion(Mat img)
{vector<RotatedRect> rects;//1.查找轮廓vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(img, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE, Point(0, 0));//2.筛选那些面积小的for (int i = 0; i < contours.size(); i++){//计算当前轮廓的面积double area = contourArea(contours[i]);//面积小于1000的全部筛选掉if (area < 1000)continue;//轮廓近似,作用较小,approxPolyDP函数有待研究double epsilon = 0.001 * arcLength(contours[i], true);Mat approx;approxPolyDP(contours[i], approx, epsilon, true);//找到最小矩形,该矩形可能有方向RotatedRect rect = minAreaRect(contours[i]);//计算高和宽int m_width = rect.boundingRect().width;int m_height = rect.boundingRect().height;//筛选那些太细的矩形,留下扁的if (m_height > m_width * 1.2)continue;//符合条件的rect添加到rects集合中rects.push_back(rect);}return rects;
}void detect(Mat img)
{//1.转化成灰度图Mat gray;cvtColor(img, gray, CV_BGR2GRAY);//2.形态学变换的预处理,得到可以查找矩形的轮廓Mat dilation = preprocess(gray);//3.查找和筛选文字区域vector<RotatedRect> rects = findTextRegion(dilation);//4.用绿线画出这些找到的轮廓for(int i = 0; i<rects.size(); i++){Point2f P[4];rects[i].points(P);for (int j = 0; j <= 3; j++){line(img, P[j], P[(j + 1) % 4], Scalar(0, 255, 0), 2);}}//5.显示带轮廓的图像imshow("img", img);
}int main(int argc, char* argv[])
{Mat textImageSrc = imread("D://11.JPG");detect(textImageSrc);waitKey(0);return 0;
}
效果如下:
opencv文字区域的提取(vs2019 c++)相关推荐
- OpenCV 文字区域的提取
效果图 比如我们有下面的一篇文章的截图,想把其中的文字区域全部找出来. 当然这里的截图只有文字和白花花的背景,效果会非常好.绿色的的矩形框的是我们根据检测到的文字区域,手动画出来的. 原理 那么我们是 ...
- Opencv实战 文字区域的提取
这篇博客的来源 笔者在技术群里看到了 OpenCV入门笔记(七) 文字区域的提取 这篇博客,确实解决文字区域的提取有很大的帮助,但是这篇博客是python来写的算法,笔者是专职C++的程序猿,pyth ...
- Opencv实战(二) 文字区域的提取 (VS2013 + C++)
这篇博客的来源 笔者在技术群里看到了 OpenCV入门笔记(七) 文字区域的提取 这篇博客,确实解决文字区域的提取有很大的帮助,但是这篇博客是python来写的算法,笔者是专职C++的程序猿,pyth ...
- opencv车牌定位与提取(vs2019 c++)
车牌特征提取的思路: (1)首先我们来看车牌部分与其他部分的区别,及车牌的特征,整体的车牌定位及提取方案即时基于此(基于灰度图像中考虑): a.车牌部分是矩形 b.车牌具有特定的长宽比: c.车牌的面 ...
- opencv车牌区域提取(VS2019 c++)
主要实现对整张图片中.将车牌分割出来. 需要进行 转换为灰度值 阈值分割,去除部分区域 连通域分析 分割出车牌所在轮廓 #include<opencv2/opencv.hpp> #incl ...
- C#基于OpenCVsharp提取文字区域
最近工作中需要用到图像文字识别,但由于图像比较大需要识别的文字比较多,所以全图识别的话效果不好,所以需要对文字区域进行检测提取,再进行识别. 功能需要用.net实现,自己对图像识别方面并不熟悉,于是上 ...
- OpenCV实战——使用MSER提取特征区域
OpenCV实战--使用MSER提取特征区域 0. 前言 1. MSER 算法原理 2. 实现 MSER 算法 3. 完整代码 相关链接 0. 前言 在分水岭算法一节中,我们了解了如何通过创建分水岭将 ...
- Opencv 图像处理-Contours函数提取轮廓及感兴趣区域ROI的必用且实用操作技巧-(涵盖Contours的一切使用基础,附代码段)
需求目的:一般都是做项目时使用opencv的findcontours和drawcontours搭配使用抓取图像内感兴趣区域. 1.Contours函数轮廓点大小排序 当使用findco ...
- OpenCV基础(基于Opencv4.4+VS2019)
OpenCV基础(基于Opencv4.4+VS2019) 1.OpenCV介绍 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是Intel公司贡献出来的,俄罗斯工程师贡献大 ...
最新文章
- Java过滤器与SpringMVC拦截器之间的关系与区别
- OS X 使用技巧——不用鼠标就能打开应用程序
- 谁能撼动美国男篮霸主地位?东京奥运看这四队
- SAP UI5 this.oModel.createBindingContext will trigger odata request
- 飞鸽改变您的互联网生活
- Go语言反射之反射调用
- java char character_Java char 与 Character
- 安装 Redis的Python客户端redis-py
- Spring框架之ioc
- linux中安装typecho的pathinfo配置
- Proximal Algorithms
- 敏捷开发框架—Scrum
- 微信小程序-仿智行火车票12306
- iOS开发之应用首次启动显示用户引导 - 疯狂的萝卜 - 博客园
- 微软手环2服务器,数据狂的最爱 微软手环2评测
- 容齐的身世_白发王妃漫夭和容齐是什么关系 女主容乐跟谁睡过遭扒可怜容齐...
- tplink无线桥接WDS小结
- 小有成就感了 教会父母玩平板电脑
- 160cracked-1
- 【Foobar 2000】如何为本地歌曲音乐评级、打分、评分、打小星星?喜爱程度分级-playcount、quick tagger
热门文章
- Hyperledger-indy indy-node部署文档
- 沙特首位女性宇航员搭乘SpaceX公司龙飞船抵达国际空间站 | 美通社头条
- 改变vscode的字体大小
- atrix 4g linux,7大特色 MOTO双核ATRIX 4G真机解析
- 风华秋实、巨星传奇,明星IP难“上市”
- sql 获取id是偶数或者是奇数的数据方法
- React P68 npm运行脚手架启动项目后显示‘无法访问此网站’
- layui table内嵌入select
- 节点操作(Dom中父子节点)
- 初识 My Batis一 什么是My Batis,JDBC缺点,My Batis简化,Mapper 代理开发,My Batis 核心配置文件