原理

我们是怎么做到检测到区域的呢?

首先,我们会注意到,文字区域和其他的图片背景很不一样。我们用膨胀处理图片,让文字变成一块块大区域,然后识别整块的轮廓,用矩形去框住这个轮廓。

这个程序分三个子函数,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++)相关推荐

  1. OpenCV 文字区域的提取

    效果图 比如我们有下面的一篇文章的截图,想把其中的文字区域全部找出来. 当然这里的截图只有文字和白花花的背景,效果会非常好.绿色的的矩形框的是我们根据检测到的文字区域,手动画出来的. 原理 那么我们是 ...

  2. Opencv实战 文字区域的提取

    这篇博客的来源 笔者在技术群里看到了 OpenCV入门笔记(七) 文字区域的提取 这篇博客,确实解决文字区域的提取有很大的帮助,但是这篇博客是python来写的算法,笔者是专职C++的程序猿,pyth ...

  3. Opencv实战(二) 文字区域的提取 (VS2013 + C++)

    这篇博客的来源 笔者在技术群里看到了 OpenCV入门笔记(七) 文字区域的提取 这篇博客,确实解决文字区域的提取有很大的帮助,但是这篇博客是python来写的算法,笔者是专职C++的程序猿,pyth ...

  4. opencv车牌定位与提取(vs2019 c++)

    车牌特征提取的思路: (1)首先我们来看车牌部分与其他部分的区别,及车牌的特征,整体的车牌定位及提取方案即时基于此(基于灰度图像中考虑): a.车牌部分是矩形 b.车牌具有特定的长宽比: c.车牌的面 ...

  5. opencv车牌区域提取(VS2019 c++)

    主要实现对整张图片中.将车牌分割出来. 需要进行 转换为灰度值 阈值分割,去除部分区域 连通域分析 分割出车牌所在轮廓 #include<opencv2/opencv.hpp> #incl ...

  6. C#基于OpenCVsharp提取文字区域

    最近工作中需要用到图像文字识别,但由于图像比较大需要识别的文字比较多,所以全图识别的话效果不好,所以需要对文字区域进行检测提取,再进行识别. 功能需要用.net实现,自己对图像识别方面并不熟悉,于是上 ...

  7. OpenCV实战——使用MSER提取特征区域

    OpenCV实战--使用MSER提取特征区域 0. 前言 1. MSER 算法原理 2. 实现 MSER 算法 3. 完整代码 相关链接 0. 前言 在分水岭算法一节中,我们了解了如何通过创建分水岭将 ...

  8. Opencv 图像处理-Contours函数提取轮廓及感兴趣区域ROI的必用且实用操作技巧-(涵盖Contours的一切使用基础,附代码段)

            需求目的:一般都是做项目时使用opencv的findcontours和drawcontours搭配使用抓取图像内感兴趣区域. 1.Contours函数轮廓点大小排序 当使用findco ...

  9. OpenCV基础(基于Opencv4.4+VS2019)

    OpenCV基础(基于Opencv4.4+VS2019) 1.OpenCV介绍 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是Intel公司贡献出来的,俄罗斯工程师贡献大 ...

最新文章

  1. Java过滤器与SpringMVC拦截器之间的关系与区别
  2. OS X 使用技巧——不用鼠标就能打开应用程序
  3. 谁能撼动美国男篮霸主地位?东京奥运看这四队
  4. SAP UI5 this.oModel.createBindingContext will trigger odata request
  5. 飞鸽改变您的互联网生活
  6. Go语言反射之反射调用
  7. java char character_Java char 与 Character
  8. 安装 Redis的Python客户端redis-py
  9. Spring框架之ioc
  10. linux中安装typecho的pathinfo配置
  11. Proximal Algorithms
  12. 敏捷开发框架—Scrum
  13. 微信小程序-仿智行火车票12306
  14. iOS开发之应用首次启动显示用户引导 - 疯狂的萝卜 - 博客园
  15. 微软手环2服务器,数据狂的最爱 微软手环2评测
  16. 容齐的身世_白发王妃漫夭和容齐是什么关系 女主容乐跟谁睡过遭扒可怜容齐...
  17. tplink无线桥接WDS小结
  18. 小有成就感了 教会父母玩平板电脑
  19. 160cracked-1
  20. 【Foobar 2000】如何为本地歌曲音乐评级、打分、评分、打小星星?喜爱程度分级-playcount、quick tagger

热门文章

  1. Hyperledger-indy indy-node部署文档
  2. 沙特首位女性宇航员搭乘SpaceX公司龙飞船抵达国际空间站 | 美通社头条
  3. 改变vscode的字体大小
  4. atrix 4g linux,7大特色 MOTO双核ATRIX 4G真机解析
  5. 风华秋实、巨星传奇,明星IP难“上市”
  6. sql 获取id是偶数或者是奇数的数据方法
  7. React P68 npm运行脚手架启动项目后显示‘无法访问此网站’
  8. layui table内嵌入select
  9. 节点操作(Dom中父子节点)
  10. 初识 My Batis一 什么是My Batis,JDBC缺点,My Batis简化,Mapper 代理开发,My Batis 核心配置文件