Pharmacodeリーダーを製作しました。 アルゴリズムなどの解説資料です。
バーコード認識の実装RICORA - shun74
View Slide
扱うバーコードPharmacode (ファーマコード)● 医薬品業界向けバーコードの世界標準● {太い、細い}黒線の2種類を組み合わせるシンプルな設計Pharmacodeの例● 決まった長さを持たない● ある番号を表す(アルファベットを含まない)
Pharmacodeのデコード● Pharmacodeは右から順に計算することでデコードできる1. 一番右から0, 1, 2…と線に番号を付ける2. i番目の線が太かったら2^(i+1)を細かったら2^iを足す● 画像のPharmacodeは計算すると...2^0 + 2^1 + 2^3 + 2^4 + 2^5 + 2^5= 1 + 2 + 8 + 16 + 32 + 32= 91
バーコード認識アルゴリズム以下のステップで認識を行う1. 画像のグレイスケール化⇢白黒化⇣2. 白黒画像のパターンの取得⇣3. パターンのデコード⇣4. デコード結果の結合⇣5. バーコード部分を塗りつぶして2に戻る⇣6. すべてのバーコードを検出したら終了
画像のグレイスケール化⇢白黒化● 画像を加工して特徴を捉えやすくする⇢ ⇢元画像(RGB) グレイスケール画像 白黒画像● 白黒の2値にすることで処理が簡単に!
白=255、黒=0となっている白黒画像のパターンの取得● 白黒画像のバーコードを値のパターンから検出する● バーコードのあるラインには特定のパターンが発生する
白黒画像のパターンの取得パターンを検出する方針1. 同じ幅の白区間が複数並んでいる場所を検出2. 白と黒の幅を比較して太い線か細い線かを判定● 白区間の幅に外れ値がないかをチェック⇢ ノイズを排除しやすくなる● 予め白区間の幅を指定しない⇢ 様々な大きさのバーコードを検出可能
パターンのデコード● 取得できたパターンからpharmacodeの値を計算● このラインからは755が検出される● パターンがない場合は0としておく
デコード結果の結合● 各ラインの結果を統合してバーコード領域を特定● 緑の線の範囲はデコード結果が755となっているはず● 同じ数値が一番長く続いた区間を検出結果とする
複数バーコードがある場合は?● 検出された部分を塗りつぶして検出をやりなおす⇢⇢⇢● バーコードが検出されなくなるまで繰り返すことで全て検出可能
検出結果バーコード領域をきれいに検出できている!
その他工夫● 画像にガンマ補正+鮮明化の前処理を行う⇢ ブレに強くなる● 白黒化はラインごとに行う⇢ よりノイズに強い白黒化● ラインごとの処理を並列化⇢ 並列化により処理を高速化
実装GitHub:https://github.com/shun74/Barcode-Recognition