OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
场景文本检测

详细说明

类别特定极值区域用于场景文本检测

下面描述的场景文本检测算法最初由 Lukás Neumann & Jiri Matas [209] 提出。类别特定极值区域(Class-specific Extremal Regions)背后的主要思想与 MSER 类似,即从图像的整个组件树中选择合适的极值区域(ERs)。然而,该技术与 MSER 不同之处在于,选择合适的 ERs 是通过一个为字符检测训练的序列分类器完成的,即放弃了 MSERs 的稳定性要求,而是选择类别特定的(不一定是稳定的)区域。

图像的组件树是通过以从 0 到 255 的递增值逐步阈值化构建的,然后通过包含关系将连续级别获得的连通分量链接成层次结构。

图像

如上图所示,即使是对于非常简单的图像,组件树也可能包含大量的区域。对于一个平均 1 兆像素的图像,这个数量很容易达到 1 x 10^6 个区域。为了有效地从所有 ERs 中选择合适的区域,该算法利用了一个具有两个区分阶段的序列分类器。

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

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

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

在每个输入通道上完成 ER 过滤后,必须将字符候选分组为高级文本块(例如,单词、文本行、段落等)。opencv_text 模块实现了两种不同的分组算法:Lukás Neumann 等人提出的用于分组水平对齐文本的[210]的“穷举搜索”算法,以及 Lluis Gomez 和 Dimosthenis Karatzas [109] [137] 提出的用于分组任意方向文本的方法(请参阅 erGrouping)。

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

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

枚举

enum  {
  cv::text::ERFILTER_NM_RGBLGrad ,
  cv::text::ERFILTER_NM_IHSGrad
}
 computeNMChannels 操作模式 更多...
 
enum  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 算法中需要独立处理的各个通道 [210]
 
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 算法第一阶段分类器的极值区域过滤器 [210]
 
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 算法第二阶段分类器的极值区域过滤器 [210]
 
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 区域。
 

枚举类型文档 (Enumeration Type Documentation)

◆ 匿名枚举

匿名枚举

#include <opencv2/text/erfilter.hpp>

computeNMChannels 操作模式

枚举值 (Enumerator)
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 操作模式

枚举值 (Enumerator)
ERGROUPING_ORIENTATION_HORIZ 
Python: cv.text.ERGROUPING_ORIENTATION_HORIZ

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

ERGROUPING_ORIENTATION_ANY 
Python: cv.text.ERGROUPING_ORIENTATION_ANY

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

注意
此模式因 NFA 代码移除而不支持(https://github.com/opencv/opencv_contrib/issues/2235

函数文档 (Function Documentation)

◆ 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 算法中需要独立处理的各个通道 [210]

参数
_src源图像。必须是 CV_8UC3 的 RGB 图像。
_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 算法第一阶段分类器的极值区域过滤器 [210]

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

通过逐步增加阈值从 0 到 255 提取图像的组件树,为每个 ER 计算增量可计算的描述符(宽高比、紧凑度、孔洞数和水平交叉数),并将其用作估计类别条件概率 P(er|character) 的分类器的特征。P(er|character) 的值通过 ER 在所有阈值下的包含关系进行跟踪,并且仅选择对应于概率 P(er|character) 的局部最大值的 ERs(如果该局部最大概率高于全局限制 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 算法第二阶段分类器的极值区域过滤器 [210]

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

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

◆ 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 算法第一阶段分类器的极值区域过滤器 [210]
er_filter2N&M 算法第二阶段分类器的极值区域过滤器 [210]
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 算法检索到的 ERs 的向量。
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 > > & contours,
std::vector< std::vector< ERStat > > & regions )

#include <opencv2/text/erfilter.hpp>

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

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

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

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