OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
无匹配项
场景文本检测

详细描述

基于类特定极值区域的场景文本检测

下面描述的场景文本检测算法最初由Lukás Neumann & Jiri Matas提出 [203]。类特定极值区域背后的主要思想与MSER类似,都是从图像的整个分量树中选择合适的极值区域 (ER)。但是,此技术与MSER的不同之处在于,合适的ERs的选择是通过训练用于字符检测的顺序分类器完成的,即放弃了MSER的稳定性要求,并选择类特定的(不一定稳定)区域。

图像的分量树是通过逐步将阈值从0增加到255,然后通过包含关系将来自连续级别的获得的连通分量在层次结构中链接起来而构建的。

图像

即使对于非常简单的图像,如上图所示,分量树也可能包含大量的区域。对于平均1百万像素的图像,此数量很容易达到1 x 10^6个区域的级别。为了有效地在所有ER中选择合适的区域,该算法使用了具有两个不同阶段的顺序分类器。

在第一阶段,为每个区域r计算可增量计算的描述符(面积、周长、边界框和欧拉数)(在O(1)中),并将其用作分类器的特征,该分类器估计类条件概率p(r|字符)。仅选择对应于概率p(r|字符)局部最大值的ER(如果它们的概率高于全局限制p_min,并且局部最大值和局部最小值之间的差值大于delta_min值)。

在第二阶段,使用信息量更大但计算成本也更高的特征将通过第一阶段的ER分类为字符类和非字符类。(孔洞面积比、凸包比和外部边界拐点个数)。

为了提高字符定位的召回率,此ER过滤过程在输入图像的不同单通道投影中进行。

在每个输入通道上完成ER过滤后,必须将字符候选分组到高级文本块中(例如,单词、文本行、段落……)。opencv_text模块实现了两种不同的分组算法:在[204]中提出的用于对水平对齐文本进行分组的穷举搜索算法,以及Lluis Gomez和Dimosthenis Karatzas在[106] [132]中提出的用于对任意方向文本进行分组的方法(参见erGrouping)。

要查看文本检测器的运行情况,请查看文本检测演示:https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/textdetection.cpp

类  cv::text::ERFilter
 Neumann和Matas场景文本检测算法[204]第一阶段和第二阶段的基类。: 更多…
 
结构体  cv::text::ERStat
 ERStat结构体表示类特定的极值区域(ER)。 更多…
 
类  cv::text::TextDetector
 提供文本检测算法接口的抽象类。 更多…
 
类  cv::text::TextDetectorCNN
 TextDetectorCNN类提供文本边界框检测的功能。此类用于查找给定输入图像的文本单词的边界框。此类使用OpenCV dnn模块加载在[165]中描述的预训练模型。修改后的SSD Caffe版本的原始存储库:https://github.com/MhLiao/TextBoxes。模型可以从DropBox下载。包含模型描述的修改后的.prototxt文件可以在opencv_contrib/modules/text/samples/textbox.prototxt中找到。 更多…
 

枚举

枚举  {
  cv::text::ERFILTER_NM_RGBLGrad ,
  cv::text::ERFILTER_NM_IHSGrad
}
 computeNMChannels操作模式 更多…
 
枚举  cv::text::erGrouping_Modes {
  cv::text::ERGROUPING_ORIENTATION_HORIZ ,
  cv::text::ERGROUPING_ORIENTATION_ANY
}
 text::erGrouping操作模式 更多…
 

函数

void cv::text::computeNMChannels (InputArray _src, OutputArrayOfArrays _channels, int _mode=ERFILTER_NM_RGBLGrad)
 计算在N&M算法[204]中独立处理的不同通道。
 
Ptr< ERFiltercv::text::createERFilterNM1 (const Ptr< ERFilter::Callback > &cb, int thresholdDelta=1, float minArea=(float) 0.00025, float maxArea=(float) 0.13, float minProbability=(float) 0.4, bool nonMaxSuppression=true, float minProbabilityDiff=(float) 0.1)
 为N&M算法[204]的第一阶段分类器创建一个极值区域过滤器。
 
Ptr< ERFiltercv::text::createERFilterNM1 (const String &filename, int thresholdDelta=1, float minArea=(float) 0.00025, float maxArea=(float) 0.13, float minProbability=(float) 0.4, bool nonMaxSuppression=true, float minProbabilityDiff=(float) 0.1)
 从提供的路径(例如/path/to/cpp/trained_classifierNM1.xml)读取N&M算法的第一阶段分类器的极值区域过滤器。
 
Ptr< ERFiltercv::text::createERFilterNM2 (const Ptr< ERFilter::Callback > &cb, float minProbability=(float) 0.3)
 创建N&M算法[204]第二阶段分类器的极值区域过滤器。
 
Ptr< ERFiltercv::text::createERFilterNM2 (const String &filename, float minProbability=(float) 0.3)
 从提供的路径(例如 /path/to/cpp/trained_classifierNM2.xml)读取N&M算法第二阶段分类器的极值区域过滤器。
 
void cv::text::detectRegions (InputArray image, const Ptr< ERFilter > &er_filter1, const Ptr< ERFilter > &er_filter2, std::vector< Rect > &groups_rects, int method=ERGROUPING_ORIENTATION_HORIZ, const String &filename=String(), float minProbability=(float) 0.5)
 从图像中提取文本区域。
 
void cv::text::detectRegions (InputArray image, const Ptr< ERFilter > &er_filter1, const Ptr< ERFilter > &er_filter2, std::vector< std::vector< Point > > &regions)
 
void cv::text::erGrouping (InputArray image, InputArray channel, std::vector< std::vector< Point > > regions, std::vector< Rect > &groups_rects, int method=ERGROUPING_ORIENTATION_HORIZ, const String &filename=String(), float minProbablity=(float) 0.5)
 
void cv::text::erGrouping (InputArray img, InputArrayOfArrays channels, std::vector< std::vector< ERStat > > &regions, std::vector< std::vector< Vec2i > > &groups, std::vector< Rect > &groups_rects, int method=ERGROUPING_ORIENTATION_HORIZ, const std::string &filename=std::string(), float minProbablity=0.5)
 查找组织成文本块的极值区域的组。
 
Ptr< ERFilter::Callbackcv::text::loadClassifierNM1 (const String &filename)
 在创建ERFilter对象时,允许隐式加载默认分类器。
 
Ptr< ERFilter::Callbackcv::text::loadClassifierNM2 (const String &filename)
 在创建ERFilter对象时,允许隐式加载默认分类器。
 
void cv::text::MSERsToERStats (InputArray image, std::vector< std::vector< Point > > &contours, std::vector< std::vector< ERStat > > &regions)
 MSER轮廓 (vector<Point>) 转换为ERStat区域。
 

枚举类型文档

◆ 匿名枚举

匿名枚举

#include <opencv2/text/erfilter.hpp>

computeNMChannels操作模式

枚举器
ERFILTER_NM_RGBLGrad 
Python: cv.text.ERFILTER_NM_RGBLGrad
ERFILTER_NM_IHSGrad 
Python: cv.text.ERFILTER_NM_IHSGrad

◆ erGrouping_Modes

#include <opencv2/text/erfilter.hpp>

text::erGrouping 操作模式

枚举器
ERGROUPING_ORIENTATION_HORIZ 
Python: cv.text.ERGROUPING_ORIENTATION_HORIZ

[203]中提出的用于对水平对齐文本进行分组的穷举搜索算法。该算法对所有可能的ER序列建模一个验证函数。ER对的验证函数包括一组基于阈值的成对规则,这些规则比较两个区域的测量值(高度比、质心角和区域距离)。ER三元组的验证函数使用最小中位数平方拟合为给定的三元组创建一个单词文本行估计,然后验证该估计是否有效(基于训练期间创建的阈值)。大于3的序列的验证函数通过验证所有长度为3的(子)序列的文本行参数是否一致来近似。

ERGROUPING_ORIENTATION_ANY 
Python: cv.text.ERGROUPING_ORIENTATION_ANY

[106] [132]中提出的用于对任意方向文本进行分组的文本分组方法。在结合了邻近度(x,y坐标)和相似性度量(颜色、大小、梯度幅度、笔划宽度等)的加权特征空间中,通过单链接聚类对区域进行聚集。SLC提供一个树状图,其中每个节点代表一个文本组假设。然后,该算法通过使用结合了旋转不变文本组分类器的输出和层次聚类有效性评估的概率度量的停止规则遍历该树状图来查找对应于文本组的分支。

注意
由于删除了NFA代码,此模式不受支持(https://github.com/opencv/opencv_contrib/issues/2235

函数文档

◆ computeNMChannels()

void cv::text::computeNMChannels ( InputArray _src,
OutputArrayOfArrays _channels,
int _mode = ERFILTER_NM_RGBLGrad )
Python
cv.text.computeNMChannels(_src[, _channels[, _mode]]) -> _channels

#include <opencv2/text/erfilter.hpp>

计算在N&M算法[204]中独立处理的不同通道。

参数
_src源图像。必须为 RGB CV_8UC3。
_channels输出 vector<Mat>,其中存储计算出的通道。
_mode操作模式。当前唯一可用的选项是:ERFILTER_NM_RGBLGrad**(默认使用) 和 **ERFILTER_NM_IHSGrad**。

在 N&M 算法中,为了获得较高的定位召回率,使用了强度 (I)、色调 (H)、饱和度 (S) 和梯度幅度通道 (Grad) 的组合。此实现还提供了一种替代组合:红色 (R)、绿色 (G)、蓝色 (B)、亮度 (L) 和梯度幅度 (Grad)。

◆ createERFilterNM1() [1/2]

Ptr< ERFilter > cv::text::createERFilterNM1 ( const Ptr< ERFilter::Callback > & cb,
int thresholdDelta = 1,
float minArea = (float) 0.00025,
float maxArea = (float) 0.13,
float minProbability = (float) 0.4,
bool nonMaxSuppression = true,
float minProbabilityDiff = (float) 0.1 )
Python
cv.text.createERFilterNM1(cb[, thresholdDelta[, minArea[, maxArea[, minProbability[, nonMaxSuppression[, minProbabilityDiff]]]]]]) -> retval
cv.text.createERFilterNM1(filename[, thresholdDelta[, minArea[, maxArea[, minProbability[, nonMaxSuppression[, minProbabilityDiff]]]]]]) -> retval

#include <opencv2/text/erfilter.hpp>

为N&M算法[204]的第一阶段分类器创建一个极值区域过滤器。

参数
cb:带有分类器的回调函数。默认分类器可以通过 loadClassifierNM1 函数隐式加载,例如,从 samples/cpp/trained_classifierNM1.xml 文件中加载。
thresholdDelta:提取组件树时后续阈值中的阈值步长
minArea:检索到的 ER 允许的最小面积(图像大小的百分比)
maxArea:检索到的 ER 允许的最大面积(图像大小的百分比)
minProbability:检索到的 ER 允许的最小概率 P(er|character)
nonMaxSuppression:是否对分支概率进行非最大值抑制
minProbabilityDiff:局部最大值和局部最小值 ER 之间的最小概率差

图像的组件树是通过逐步增加阈值(从 0 到 255)提取的,逐步计算每个 ER 的描述符(纵横比、紧凑性、孔数和水平交叉数),并将它们用作分类器的特征,该分类器估计类条件概率 P(er|character)。使用 ER 在所有阈值上的包含关系跟踪 P(er|character) 的值,并且只选择对应于概率 P(er|character) 局部最大值的 ER(如果概率的局部最大值高于全局限制 pmin,并且局部最大值和局部最小值之间的差大于 minProbabilityDiff)。

◆ createERFilterNM1() [2/2]

Ptr< ERFilter > cv::text::createERFilterNM1 ( const String & filename,
int thresholdDelta = 1,
float minArea = (float) 0.00025,
float maxArea = (float) 0.13,
float minProbability = (float) 0.4,
bool nonMaxSuppression = true,
float minProbabilityDiff = (float) 0.1 )
Python
cv.text.createERFilterNM1(cb[, thresholdDelta[, minArea[, maxArea[, minProbability[, nonMaxSuppression[, minProbabilityDiff]]]]]]) -> retval
cv.text.createERFilterNM1(filename[, thresholdDelta[, minArea[, maxArea[, minProbability[, nonMaxSuppression[, minProbabilityDiff]]]]]]) -> retval

#include <opencv2/text/erfilter.hpp>

从提供的路径(例如/path/to/cpp/trained_classifierNM1.xml)读取N&M算法的第一阶段分类器的极值区域过滤器。

这是一个重载的成员函数,为了方便提供。它与上面的函数的不同之处仅在于它接受的参数。

◆ createERFilterNM2() [1/2]

Ptr< ERFilter > cv::text::createERFilterNM2 ( const Ptr< ERFilter::Callback > & cb,
float minProbability = (float) 0.3 )
Python
cv.text.createERFilterNM2(cb[, minProbability]) -> retval
cv.text.createERFilterNM2(filename[, minProbability]) -> retval

#include <opencv2/text/erfilter.hpp>

创建N&M算法[204]第二阶段分类器的极值区域过滤器。

参数
cb:带有分类器的回调函数。默认分类器可以通过 loadClassifierNM2 函数隐式加载,例如,从 samples/cpp/trained_classifierNM2.xml 文件中加载。
minProbability:检索到的 ER 允许的最小概率 P(er|character)

在第二阶段,使用信息量更大但计算成本也更高的特征将通过第一阶段的 ER 分类为字符类和非字符类。分类器使用第一阶段计算的所有特征以及以下附加特征:孔面积比、凸包比和外部拐点数量。

◆ createERFilterNM2() [2/2]

Ptr< ERFilter > cv::text::createERFilterNM2 ( const String & filename,
float minProbability = (float) 0.3 )
Python
cv.text.createERFilterNM2(cb[, minProbability]) -> retval
cv.text.createERFilterNM2(filename[, minProbability]) -> retval

#include <opencv2/text/erfilter.hpp>

从提供的路径(例如 /path/to/cpp/trained_classifierNM2.xml)读取N&M算法第二阶段分类器的极值区域过滤器。

这是一个重载的成员函数,为了方便提供。它与上面的函数的不同之处仅在于它接受的参数。

◆ detectRegions() [1/2]

void cv::text::detectRegions ( InputArray 图像,
const Ptr< ERFilter > & er_filter1,
const Ptr< ERFilter > & er_filter2,
std::vector< Rect > & groups_rects,
int method = ERGROUPING_ORIENTATION_HORIZ,
const String & filename = String(),
float minProbability = (float) 0.5 )
Python
cv.text.detectRegions(image, er_filter1, er_filter2) -> regions
cv.text.detectRegions(image, er_filter1, er_filter2[, method[, filename[, minProbability]]]) -> groups_rects

#include <opencv2/text/erfilter.hpp>

从图像中提取文本区域。

参数
图像需要从中提取文本块的源图像。应该是 CV_8UC3(彩色)。
er_filter1N&M 算法第一阶段分类器的极值区域过滤器 [204]
er_filter2N&M 算法第二阶段分类器的极值区域过滤器 [204]
groups_rects包含文本的矩形块的输出列表
method分组方法(参见 text::erGrouping_Modes)。可以是 ERGROUPING_ORIENTATION_HORIZ 或 ERGROUPING_ORIENTATION_ANY 之一。
filename包含分类器模型的 XML 或 YAML 文件(例如 samples/trained_classifier_erGrouping.xml)。仅当分组方法为 ERGROUPING_ORIENTATION_ANY 时才使用。
minProbability接受分组的最小概率。仅当分组方法为 ERGROUPING_ORIENTATION_ANY 时才使用。

◆ detectRegions() [2/2]

void cv::text::detectRegions ( InputArray 图像,
const Ptr< ERFilter > & er_filter1,
const Ptr< ERFilter > & er_filter2,
std::vector< std::vector< Point > > & regions )
Python
cv.text.detectRegions(image, er_filter1, er_filter2) -> regions
cv.text.detectRegions(image, er_filter1, er_filter2[, method[, filename[, minProbability]]]) -> groups_rects

◆ erGrouping() [1/2]

void cv::text::erGrouping ( InputArray 图像,
InputArray channel,
std::vector< std::vector< Point > > regions,
std::vector< Rect > & groups_rects,
int method = ERGROUPING_ORIENTATION_HORIZ,
const String & filename = String(),
float minProbablity = (float) 0.5 )
Python
cv.text.erGrouping(image, channel, regions[, method[, filename[, minProbablity]]]) -> groups_rects

◆ erGrouping() [2/2]

void cv::text::erGrouping ( InputArray img,
InputArrayOfArrays channels,
std::vector< std::vector< ERStat > > & regions,
std::vector< std::vector< Vec2i > > & groups,
std::vector< Rect > & groups_rects,
int method = ERGROUPING_ORIENTATION_HORIZ,
const std::string & filename = std::string(),
float minProbablity = 0.5 )
Python
cv.text.erGrouping(image, channel, regions[, method[, filename[, minProbablity]]]) -> groups_rects

#include <opencv2/text/erfilter.hpp>

查找组织成文本块的极值区域的组。

参数
img从中提取区域的原始 RGB 或灰度图像。
channels从中提取区域的单通道图像 CV_8UC1 向量。
regions从每个通道的 ERFilter 算法检索到的 ER 向量。
groups算法的输出存储在此参数中,作为提供区域的索引列表集。
groups_rects算法的输出存储在此参数中,作为矩形列表。
method分组方法(参见 text::erGrouping_Modes)。可以是 ERGROUPING_ORIENTATION_HORIZ 或 ERGROUPING_ORIENTATION_ANY 之一。
filename包含分类器模型的 XML 或 YAML 文件(例如 samples/trained_classifier_erGrouping.xml)。仅当分组方法为 ERGROUPING_ORIENTATION_ANY 时才使用。
minProbablity接受分组的最小概率。仅当分组方法为 ERGROUPING_ORIENTATION_ANY 时才使用。

◆ loadClassifierNM1()

Ptr< ERFilter::Callback > cv::text::loadClassifierNM1 ( const String & filename)
Python
cv.text.loadClassifierNM1(filename) -> retval

#include <opencv2/text/erfilter.hpp>

在创建ERFilter对象时,允许隐式加载默认分类器。

参数
filename包含分类器模型的 XML 或 YAML 文件(例如 trained_classifierNM1.xml)

返回指向 ERFilter::Callback 的指针。

◆ loadClassifierNM2()

Ptr< ERFilter::Callback > cv::text::loadClassifierNM2 ( const String & filename)
Python
cv.text.loadClassifierNM2(filename) -> retval

#include <opencv2/text/erfilter.hpp>

在创建ERFilter对象时,允许隐式加载默认分类器。

参数
filename包含分类器模型的 XML 或 YAML 文件(例如 trained_classifierNM2.xml)

返回指向 ERFilter::Callback 的指针。

◆ MSERsToERStats()

void cv::text::MSERsToERStats ( InputArray 图像,
std::vector< std::vector< Point > > & 轮廓,
std::vector< std::vector< ERStat > > & regions )

#include <opencv2/text/erfilter.hpp>

MSER轮廓 (vector<Point>) 转换为ERStat区域。

参数
图像从中提取 MSER 的源图像 CV_8UC1。
轮廓包含所有轮廓的输入向量 (vector<Point>)。
regions存储 ERStat 区域的输出。

它以 OpenCV MSER 特征检测器提供的轮廓作为输入,并返回两个 ERStats 向量作为输出。这是因为 MSER() 输出在一个 single vector<Point> 中包含 MSER+ 和 MSER- 区域,该函数将它们分离到两个不同的向量中(这就像从两个不同的通道中提取 ERStats 一样)。

可以在文本检测 webcam_demo 中找到 MSERsToERStats 的使用示例: https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/webcam_demo.cpp