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

详细描述

用于场景文本检测的类特异性极值区域

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

图像的分量树是通过将阈值从 0 到 255 逐步递增地进行二值化,然后根据包含关系将连续层中获得的连通分量按层次结构链接起来而构建的

image

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

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

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

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

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

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

类  cv::text::ERFilter
 Neumann 和 Matas 场景文本检测算法 [207] 第一阶段和第二阶段的基类。: 更多...
 
结构体  cv::text::ERStat
 ERStat 结构表示一个类特异性极值区域 (ER)。 更多...
 
类  cv::text::TextDetector
 一个为文本检测算法提供接口的抽象类。 更多...
 
类  cv::text::TextDetectorCNN
 TextDetectorCNN 类提供了文本边界框检测的功能。该类用于在给定输入图像的情况下查找文本单词的边界框。该类使用 OpenCV dnn 模块加载 [168] 中描述的预训练模型。包含修改版 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 算法 [207] 中需要独立处理的不同通道。
 
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 算法 [207] 的第一阶段分类器创建一个极值区域滤波器。
 
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 算法 [207] 的第二阶段分类器创建一个极值区域滤波器。
 
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

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

ERGROUPING_ORIENTATION_ANY 
Python: cv.text.ERGROUPING_ORIENTATION_ANY

[108] [135] 中提出的文本分组方法,用于任意方向文本的分组。区域通过加权特征空间中的单链接聚类进行聚合,该特征空间结合了邻近度(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 算法 [207] 中需要独立处理的不同通道。

参数
_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 算法 [207] 的第一阶段分类器创建一个极值区域滤波器。

参数
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)。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 算法 [207] 的第二阶段分类器创建一个极值区域滤波器。

参数
cb:带有分类器的回调。默认分类器可以使用函数 loadClassifierNM2 隐式加载,例如从 samples/cpp/trained_classifierNM2.xml 文件中加载。
minProbability:允许检索到的 ER 的最小概率 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 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 )
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>

从图像中提取文本区域。

参数
image需要从中提取文本块的源图像。应为 CV_8UC3(彩色)。
er_filter1N&M 算法 [207] 第一阶段分类器的极值区域滤波器。
er_filter2N&M 算法 [207] 第二阶段分类器的极值区域滤波器。
groups_rects输出文本矩形块列表。
方法分组方法(参见 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 image,
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 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 )
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算法的输出作为矩形列表存储在此参数中。
方法分组方法(参见 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 image,
std::vector< std::vector< Point > > & contours,
std::vector< std::vector< ERStat > > & regions )

#include <opencv2/text/erfilter.hpp>

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

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

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

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