Halconライブラリを使用したバーコードデコードの一般的なプロセスは、以下の4つのステップで構成されます。
デコードモデルの初期化 デコードパラメータの設定 デコード処理の実行 モデルの解放とメモリのクリーンアップ
* デコードモデルの作成
create_bar_code_model ([], [], BarCodeHandle)
* スキャンライン数の設定 (例: 30本)
set_bar_code_param (BarCodeHandle, 'num_scanlines', 30)
* バーコードの検索とデコード (例: Code 128, Code 39)
find_bar_code (Image, SymbolRegions1, BarCodeHandle, ['Code 128','Code 39'], BarCodeStrings)
* デコードモデルの解放
clear_bar_code_model (BarCodeHandle)
通常、デコード成功率と処理速度の向上を目指し、「デコードパラメータの設定」ステップでパラメータ調整を行います。しかし、このアプローチには限界があり、パラメータを最適化してもデコードが困難な場合があります。
スマートフォンのQRコードスキャンを例に考えてみましょう。一度でスキャンできない場合でも、デバイスの位置を少し変えたり、ライトを点灯させて再度試みると、多くの場合成功します。これは、スマートフォンが複数回のデコード試行を行っているためと推測されます。複数回のフォーカス調整や露出設定、そしてデバイス位置の変更により、デコード成功の確率を高めているのです。スマートフォンのデコード処理は短時間で行われるため、ユーザーには一回の操作で完了したように見えます。
この考え方をHalconでのデコード処理に応用できます。デコードが失敗した場合、異なるパラメータ設定で再試行したり、カメラの露出設定を変更して再度画像を取得し、デコードを試みます。工業用カメラの位置変更は現実的ではないため、ここでは考慮しません。
このアプローチに基づいたHalconコードの例を以下に示します(主要部分のみ)。
* 初期化
Length := 0
DecodedDataStrings := []
* ループ処理によるコントラスト調整とデコード試行
* min_gray: 最小輝度値、max_gray: 最大輝度値
for min_gray := 0 to 30 by 3
for max_gray := 255 to 180 by -7
* scale_gray_map関数で輝度マッピングを行い、コントラストを強調
scale_gray_map (Image, Image2, min_gray, max_gray)
* DataCode (QRコードなど) のデコード
find_data_code_2d (Image2, SymbolXLDs, hv_DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
* デコードされた文字列の長さを取得
tuple_strlen (DecodedDataStrings, Length)
* 解読成功の簡易判定 (文字列長が5より大きい場合)
if (Length > 5)
break ' 内側のループを抜ける
endif
endfor
* 内側のループで解読成功した場合、外側のループも抜ける
if (Length > 5)
break
endif
endfor
* デコード結果の表示
disp_message (3600, 'デコード結果: ' + DecodedDataStrings , 'image', 100, 12, 'black', 'true')
このコードでは、2重のforループを使用して画像のコントラストを段階的に変化させ、新しい画像 Image2 に対してデコード処理を実行します。
ループのステップ幅は、処理速度を考慮して適切に設定する必要があります。ステップ幅が小さすぎるとループ回数が増加し、処理時間が長くなります。
scale_gray_map 関数は、輝度マッピングによって画像のコントラストを強調する関数です。詳細な実装については、https://www.cnblogs.com/xh6300/p/7512532.html を参照してください。
この例では、異なる露出設定をシミュレートすることでデコード成功率を向上させていますが、デコード失敗時に set_data_code_2d_param 関数を用いてデコードパラメータを動的に変更するアプローチも有効です。