OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
シーンテキスト検出

詳細説明

シーンテキスト検出のためのクラス固有Extremal Region

以下で説明するシーンテキスト検出アルゴリズムは、当初 Lukás Neumann & Jiri Matas [209] によって提案されたものである。クラス固有Extremal Regionの背後にある主な考え方は MSER と類似しており、画像のコンポーネントツリー全体から適切なExtremal Region (ER) を選択する点で共通している。しかしこの手法は、適切なERの選択を文字検出のために学習された逐次分類器によって行う点で MSER と異なる。すなわち、MSERの安定性要件を取り払い、クラス固有の (必ずしも安定とは限らない) 領域を選択する。

画像のコンポーネントツリーは、しきい値を0から255まで段階的に増加させてしきい値処理を行い、得られた連結成分を連続する各レベルから包含関係によって階層構造として連結することで構築される:

image

コンポーネントツリーは、前の画像で示したような非常に単純な画像であっても膨大な数の領域を含むことがある。この数は、平均的な1メガピクセルの画像で容易に 1 x 10\^6 領域のオーダーに達することがある。すべてのERの中から適切な領域を効率的に選択するために、アルゴリズムは2つの区別された段階を持つ逐次分類器を利用する。

第1段階では、逐次計算可能な記述子 (面積、周囲長、バウンディングボックス、オイラー数) が各領域 r に対して (O(1) で) 計算され、クラス条件付き確率 p(r|character) を推定する分類器の特徴量として用いられる。確率 p(r|character) の局所的最大値に対応するERのみが選択される (その確率が大域的な下限 p_min を上回り、かつ局所的最大値と局所的最小値の差が delta_min 値より大きい場合)。

第2段階では、第1段階を通過したERが、より情報量が多いが計算コストも高い特徴量を用いて文字クラスと非文字クラスに分類される。(穴面積比、凸包比、外側境界の変曲点の数)。

このERフィルタリング処理は、文字の局在化の再現率を高めるために、入力画像の異なるシングルチャンネル射影に対して行われる。

各入力チャンネルでERフィルタリングが完了した後、文字候補を高レベルのテキストブロック (すなわち単語、テキスト行、段落など) にグルーピングしなければならない。opencv_text モジュールは2つの異なるグルーピングアルゴリズムを実装している: 水平方向に整列したテキストをグルーピングするために [210] で提案された全探索アルゴリズムと、任意の方向のテキストをグルーピングするために Lluis Gomez と Dimosthenis Karatzas が [109] [137] で提案した手法である (erGrouping を参照)。

テキスト検出器の動作を確認するには、textdetection デモを参照: https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/textdetection.cpp

クラス

class  cv::text::ERFilter
 Neumann と Matas のシーンテキスト検出アルゴリズム [210] の第 1 段階および第 2 段階の基底クラス。 : 詳細...
 
struct  cv::text::ERStat
 ERStat 構造体は、クラス固有の Extremal Region (ER) を表す。詳細...
 
class  cv::text::TextDetector
 テキスト検出アルゴリズムのインターフェースを提供する抽象クラス。続きを読む...
 
class  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] の第 1 段階分類器のための Extremal Region Filter を生成する。
 
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 アルゴリズムの第 1 段階分類器のための Extremal Region Filter を、指定されたパス (例: /path/to/cpp/trained_classifierNM1.xml) から読み込む。
 
Ptr< ERFiltercv::text::createERFilterNM2 (const Ptr< ERFilter::Callback > &cb, float minProbability=(float) 0.3)
 N&M アルゴリズム [210] の第 2 段階分類器のための Extremal Region Filter を生成する。
 
Ptr< ERFiltercv::text::createERFilterNM2 (const String &filename, float minProbability=(float) 0.3)
 N&M アルゴリズムの第 2 段階分類器のための Extremal Region Filter を、指定されたパス (例: /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)
 テキストブロックとして構成された Extremal Region のグループを見つける。
 
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 領域に変換する。
 

列挙型詳解

◆ anonymous enum

anonymous enum

#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

水平方向に整列したテキストをグルーピングするために [209] で提案された全探索アルゴリズム。このアルゴリズムは、可能なすべてのERシーケンスに対する検証関数をモデル化する。ERペアの検証関数は、2つの領域の測定値 (高さの比、重心の角度、領域間距離) を比較する、しきい値ベースのペアワイズルールの集合からなる。ERトリプレットの検証関数は、与えられたトリプレットに対して最小メディアン二乗法によるフィッティングを用いて単語のテキスト行の推定を生成し、その推定が (学習時に作成されたしきい値に基づいて) 妥当であることを検証する。長さが3より大きいシーケンスの検証関数は、長さ3のすべての (部分) シーケンスのテキスト行の引数が一貫していることを検証することで近似される。

ERGROUPING_ORIENTATION_ANY 
Python: cv.text.ERGROUPING_ORIENTATION_ANY

任意の方向のテキストをグルーピングするために [109] [137] で提案されたテキストグルーピング手法。領域は、近接度 (x,y 座標) と類似度の尺度 (色、サイズ、勾配の大きさ、ストローク幅など) を組み合わせた重み付き特徴空間における単連結クラスタリング (Single Linkage Clustering) によって凝集される。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アルゴリズム [210] において独立に処理される各種チャンネルを計算する。

引数
_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アルゴリズム [210] の第1段階分類器用のExtremal Regionフィルタを作成する。

引数
cb: 分類器を持つコールバック。デフォルトの分類器は関数 loadClassifierNM1 で暗黙的に読み込むことができる。例えば samples/cpp/trained_classifierNM1.xml のファイルから読み込む
thresholdDelta: コンポーネントツリーを抽出する際の、後続のしきい値における thresholdのステップ
minArea: 取得されるER'sに許容される最小面積 (画像サイズに対する%)
maxArea: 取得されるER'sに許容される最大面積 (画像サイズに対する%)
minProbability: 取得されるER'sに許容される最小確率 P(er|character)
nonMaxSuppression: ブランチの確率に対して非最大抑制を行うかどうか
minProbabilityDiff: 局所最大ERと局所最小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>

指定されたパス (例: /path/to/cpp/trained_classifierNM1.xml) から、N&Mアルゴリズムの第1段階分類器用のExtremal Regionフィルタを読み込む。

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ 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] の第2段階分類器用のExtremal Regionフィルタを作成する。

引数
cb: 分類器を指定するコールバック。デフォルトの分類器は関数 loadClassifierNM2 によって暗黙的に読み込める。例えば samples/cpp/trained_classifierNM2.xml のファイルから読み込む。
minProbability: 取得されるER'sに許容される最小確率 P(er|character)

第2段階では、第1段階を通過したERが、より情報量が多いが計算コストも高い特徴量を用いて文字クラスと非文字クラスに分類される。分類器は、第1段階で計算されたすべての特徴量に加え、次の追加特徴量を使用する: 穴面積比、凸包比、外側変曲点の数。

◆ 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アルゴリズムの第2段階分類器用のExtremal Regionフィルタを読み込む。

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ 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アルゴリズム [210] の第1段階分類器用のExtremal Regionフィルタ
er_filter2N&Mアルゴリズム [210] の第2段階分類器用のExtremal Regionフィルタ
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 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>

テキストブロックとして構成されたExtremal Regionのグループを見つける。

引数
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 image,
std::vector< std::vector< Point > > & contours,
std::vector< std::vector< ERStat > > & regions )

#include <opencv2/text/erfilter.hpp>

MSER の輪郭 (vector<Point>) を ERStat 領域に変換する。

引数
imageMSERを抽出した元の入力画像 CV_8UC1。
contoursすべての輪郭を含む入力ベクトル (vector<Point>)。
regionsERStat 領域が格納される出力。

OpenCVの MSER 特徴検出器が提供する輪郭を入力として受け取り、2つのERStatのベクトルを出力として返す。これは、MSER() の出力が単一の vector<Point> の中にMSER+とMSER-の両方の領域を含むためであり、本関数はそれらを2つの異なるベクトルに分離する (これはあたかも2つの異なるチャンネルからERStatが抽出されたかのようになる)。

MSERsToERStats の使用例は、テキスト検出の webcam_demo にある: https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/webcam_demo.cpp