![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
前のチュートリアル: Arucoモジュール FAQ
| 互換性 | 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つのメンバ関数があり、以下で紹介する。
省略可能で、単一ファイルのONNXネットワーク(sr.onnx)として渡される超解像モデルを使ってバーコード検出器を構築できる。変換済みモデルは https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode からダウンロードできる。Caffeモデル(sr.prototxt / sr.caffemodel)は現在はサポートされていない。
出力を格納する変数を生成する必要がある。
cv::barcode::BarcodeDetector::detect メソッドは、方向の一貫性(directional coherence)に基づくアルゴリズムを使用する。まず、各ピクセルの平均二乗勾配を計算する [23] 。次に、画像を正方形のパッチに分割し、各パッチの勾配方向の一貫性(gradient orientation coherence)と平均勾配方向(mean gradient direction)を計算する。そして、勾配方向の一貫性が高くかつ勾配方向が類似しているすべてのパッチを連結する。この段階では、マルチスケールのパッチを使って多様なサイズのバーコードの勾配分布を捉え、非最大抑制(non-maximum suppression)を適用して重複した候補をフィルタリングする。最後に、cv::minAreaRect を使ってROIを囲み、矩形のコーナーを出力する。
入力画像内のコードを検出し、検出された矩形の角を出力する:
cv::barcode::BarcodeDetector::decode メソッドは、画像がしきい値より小さい場合にまず(必要に応じて)画像を超解像で拡大し、画像をシャープ化したうえで、OTSUまたは局所二値化によって二値化する。次に、指定したバーコードパターンとの類似度を照合することで、バーコードの内容を読み取る。
cv::barcode::BarcodeDetector::detectAndDecode は、detect と decode を1回の呼び出しにまとめたものである。この関数の使い方を示す簡単な例を以下に示す:
結果を可視化する:
元画像:
検出後: