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