![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
前のチュートリアル: カスケード分類器の学習
次のチュートリアル: サポートベクターマシン入門
| 互換性 | OpenCV >= 4.8 |
この章では、OpenCVで利用できるバーコードの検出・デコード手法に慣れる。
バーコードは実生活で商品を識別する主要な技術である。一般的なバーコードは、反射率が大きく異なる黒いバーと白いバーで構成された平行な線のパターンである。バーコード認識とは、バーコードを水平方向にスキャンし、幅や色の異なるバーで構成された2進コードの列、すなわちバーコードのコード情報を取得することである。バーコードの内容は、さまざまなバーコード符号化方式と照合することでデコードできる。現在、EAN-8、EAN-13、UPC-A、UPC-Eの各規格をサポートしている。
https://en.wikipedia.org/wiki/Universal_Product_Code および https://en.wikipedia.org/wiki/International_Article_Number を参照のこと。
バーコード認識のためにいくつかのアルゴリズムが導入された。
コーディングにあたっては、まず cv::barcode::BarcodeDetector オブジェクトを生成する必要がある。このクラスには主に3つのメンバ関数があり、以下で紹介する。
必要に応じて、超解像モデルを指定してバーコード検出器を構築できる。モデルは https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode (sr.caffemodel, sr.prototxt)からダウンロードする必要がある。
出力を格納する変数を生成する必要がある。
cv::barcode::BarcodeDetector::detect メソッドは、方向のコヒーレンスに基づくアルゴリズムを用いる。まず、各ピクセルの平均二乗勾配を計算する [23] 。次に、画像を正方形のパッチに分割し、各パッチの勾配方向のコヒーレンスと平均勾配方向を計算する。続いて、勾配方向のコヒーレンスが高くかつ勾配方向が類似するすべてのパッチを連結する。この段階では、マルチスケールのパッチを用いてさまざまなサイズのバーコードの勾配分布を捉え、非最大抑制を適用して重複した候補を除去する。最後に、cv::minAreaRect を用いてROIを囲み、矩形の角を出力する。
入力画像内のコードを検出し、検出された矩形の角を出力する:
cv::barcode::BarcodeDetector::decode メソッドは、画像がしきい値より小さい場合にまず(必要に応じて)画像を超解像で拡大し、画像をシャープ化したうえで、OTSUまたは局所二値化によって二値化する。次に、指定したバーコードパターンとの類似度を照合することで、バーコードの内容を読み取る。
cv::barcode::BarcodeDetector::detectAndDecode は、detect と decode を1回の呼び出しにまとめたものである。この関数の使い方を示す簡単な例を以下に示す:
結果を可視化する:
元画像:
検出後: