OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
| 枚举 | 函数
场景文本检测

详细说明

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

以下描述的场景文本检测算法最初是由 Lukás Neumann 和 Jiri Matas 提出 [203]。特定于类的极值区域背后的主要思想类似于 MSER,适合于从图像的整体组件树中选择极值区域 (ER)。不过,此技术不同于 MSER 的一点是,适合 ER 的选择是通过一个专门用于字符检测的序列分类器实现的,即放弃对 MSER 稳定性的要求,并选择特定于类的(不一定稳定的)区域。

图像的组件树是通过从 0 逐步阈值化增长值到 255,然后通过它们的包含关系将从连续多级获得的连接组件链接起来构建的

图像

即使对于像上一幅图像所示的非常简单的图像,组件树也可能包含大量区域。对于平均 100 万像素的图像,此数量可轻松达到 1 x 10\^6 个区域的数量级。为了在所有 ER 中有效地选择合适的区域,算法利用了一个具有两个不同阶段的序列分类器。

在第一阶段,先为每个区域 r 计算逐渐可计算的描述符(面积、周长、限定框和欧拉常数),然后将其用作分类器的特征,分类器可估计类条件概率 p(r|character)。只选择对应于概率 p(r|character) 局部极大值的 ER(如果其概率高于全局限制 p_min,并且局部极大值与局部极小值之间的差异大于 delta_min 值)。

在第二阶段,通过使用更丰富但计算成本也更高的特征(空洞面积比率、凸包比率以及外部边界反曲点的数量),将通过第一阶段的 ER 分类到字符和非字符类别中。

此 ER 过滤流程是在输入图像的不同单通道投影中完成的,以提高字符定位召回率。

每个输入通道执行 ER 过滤之后,字符候选必须分组在高级文本块(即单词、文本行、段落,...)中。opencv_text 模块实施了两种不同的分组算法:[204] 中为分组水平对齐的文本提出的穷举搜索算法和 Lluis Gomez 和 [107] [133] 中为分组任意定向文本提出的方法(见 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
 
描述中预训练的模型 [165]。具有修改后的 SSD Caffe 版本的原始存储库:https://github.com/MhLiao/TextBoxes。模型可以从">
DropBox下载。可以在opencv_contrib/modules/text/samples/textbox.prototxt 中找到具有模型描述的修改的 .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] 的第 1 级分类器创建一个极值区域滤波器。
 
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)
 从提供的路径读取 N&M 算法的第一阶段分类器的极值区域滤波器,例如 /path/to/cpp/trained_classifierNM1.xml。
 
Ptr< ERFiltercv::text::createERFilterNM2 (const Ptr< ERFilter::Callback > &cb, float minProbability=(float) 0.3)
 为 N&M 算法 [204] 的第 2 级分类器创建一个极值区域滤波器。
 
Ptr< ERFiltercv::text::createERFilterNM2 (const String &filename, float minProbability=(float) 0.3)
 从提供的路径读取 N&M 算法的第二阶段分类器的极值区域滤波器,例如 /path/to/cpp/trained_classifierNM2.xml。
 
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轮廓(벡터 <点>)转换为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

Gomez 在 [107] [133] 中提出的文本分组方法,用于对任意方向上的文本进行分组。在加权特征空间中,区域被单连通性聚类聚合在一起,其中将邻近(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] 的第 1 级分类器创建一个极值区域滤波器。

参数
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) 的局部极大值相对应的 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>

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

这是一个带重载的成员函数,供方便起见提供。它与上面的函数仅在接受的参数方面有所不同。

◆ 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] 的第 2 级分类器创建一个极值区域滤波器。

参数
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>

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

这是一个带重载的成员函数,供方便起见提供。它与上面的函数仅在接受的参数方面有所不同。

◆ 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] 的第 1 阶段分类器的极值区域过滤器
er_filter2N&M 算法 [204] 的第 2 阶段分类器的极值区域过滤器
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 向量。
regionsERFilter 算法从每个通道中检索的 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 > > &  contours,
std::vector< std::vector< ERStat > > &  regions 
)

#include <opencv2/text/erfilter.hpp>

MSER轮廓(벡터 <点>)转换为ERStat区域。

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

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

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