「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Windows、Linux、macOS 用の Python バーコード スキャナーを構築する方法

Windows、Linux、macOS 用の Python バーコード スキャナーを構築する方法

2024 年 11 月 2 日に公開
ブラウズ:669

バーコード スキャンは、小売、物流から医療に至るまで、さまざまな業界で不可欠なツールとなっています。デスクトップ プラットフォームでは、手動でデータを入力することなく情報を迅速に取得して処理できるため、時間を節約し、エラーを減らすことができます。このチュートリアルでは、WindowsLinux 用の Python バーコード スキャナを構築することで、Dynamsoft Capture Vision SDKの機能を引き続き探索していきます。 、macOS

macOS での Python バーコード スキャナーのデモ

前提条件

  • Dynamsoft Capture Vision トライアル ライセンス: Dynamsoft Capture Vision SDK の 30 日間のトライアル ライセンス キーを取得します。

  • Python パッケージ: 次のコマンドを使用して、必要な Python パッケージをインストールします:

    pip install dynamsoft-capture-vision-bundle opencv-python
    

    これらのパッケージは何のためにありますか?

    • dynamsoft-capture-vision-bundle は、Python 用の Dynamsoft Capture Vision SDK です。
    • opencv-python はカメラ フレームをキャプチャし、処理された画像結果を表示します。

静止画像からバーコードを読み取る

Dynamsoft Capture Vision SDK は、さまざまな画像処理タスクと統合された統合フレームワークであるため、PresetTemplate 名を Capture() メソッドに渡すことで、画像処理モードを簡単に切り替えることができます。

Dynamsoft Capture Vision SDK の組み込みテンプレート

次のコード スニペットは、Dynamsoft Capture Vision SDK の組み込みの PresetTemplate 列挙を示しています。

クラス EnumPresetTemplate(Enum): PT_DEFAULT = _DynamsoftCaptureVisionRouter.getPT_DEFAULT() PT_READ_BARCODES = _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES() PT_RECOGNIZE_TEXT_LINES = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_TEXT_LINES() PT_DETECT_DOCUMENT_BOUNDARIES = ( _DynamsoftCaptureVisionRouter.getPT_DETECT_DOCUMENT_BOUNDARIES() ) PT_DETECT_AND_NORMALIZE_DOCUMENT = ( _DynamsoftCaptureVisionRouter.getPT_DETECT_AND_NORMALIZE_DOCUMENT() ) PT_NORMALIZE_DOCUMENT = _DynamsoftCaptureVisionRouter.getPT_NORMALIZE_DOCUMENT() PT_READ_BARCODES_SPEED_FIRST = ( _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_SPEED_FIRST() ) PT_READ_BARCODES_READ_RATE_FIRST = ( _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_READ_RATE_FIRST() ) PT_READ_SINGLE_BARCODE = _DynamsoftCaptureVisionRouter.getPT_READ_SINGLE_BARCODE() PT_RECOGNIZE_NUMBERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS() PT_RECOGNIZE_LETTERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_LETTERS() PT_RECOGNIZE_NUMBERS_AND_LETTERS = ( _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_LETTERS() ) PT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS = ( _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS() ) PT_RECOGNIZE_大文字_文字 = ( _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_UPPERCASE_LETTERS() )
class EnumPresetTemplate(Enum):
    PT_DEFAULT = _DynamsoftCaptureVisionRouter.getPT_DEFAULT()
    PT_READ_BARCODES = _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES()
    PT_RECOGNIZE_TEXT_LINES = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_TEXT_LINES()
    PT_DETECT_DOCUMENT_BOUNDARIES = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_DOCUMENT_BOUNDARIES()
    )
    PT_DETECT_AND_NORMALIZE_DOCUMENT = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_AND_NORMALIZE_DOCUMENT()
    )
    PT_NORMALIZE_DOCUMENT = _DynamsoftCaptureVisionRouter.getPT_NORMALIZE_DOCUMENT()
    PT_READ_BARCODES_SPEED_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_SPEED_FIRST()
    )
    PT_READ_BARCODES_READ_RATE_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_READ_RATE_FIRST()
    )
    PT_READ_SINGLE_BARCODE = _DynamsoftCaptureVisionRouter.getPT_READ_SINGLE_BARCODE()
    PT_RECOGNIZE_NUMBERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS()
    PT_RECOGNIZE_LETTERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_LETTERS()
    PT_RECOGNIZE_NUMBERS_AND_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_LETTERS()
    )
    PT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS()
    )
    PT_RECOGNIZE_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_UPPERCASE_LETTERS()
    )
PT_DEFAULT テンプレートは、ドキュメント検出、MRZ 認識、バーコード検出などの複数のタスクをサポートします。特にバーコード検出のパフォーマンスを最適化するには、テンプレートを EnumPresetTemplate.PT_READ_BARCODES.value.

に設定します。

バーコード検出用の Python コード

前のドキュメント検出と MRZ 認識の例を参照すると、次のコードを使用して静止画像からバーコードを読み取ることができます:


インポートシステム dynamsoft_capture_vision_bundle インポートから * OSをインポートする インポートCV2 numpyをnpとしてインポート utils インポートから * __name__ == '__main__'の場合: print("********************************************** ***********") print("Dynamsoft Capture Vision へようこそ - バーコード サンプル") print("********************************************** ***********") エラーコード、エラーメッセージ = LicenseManager.init_license( 「ライセンスキー」) error_code != EnumErrorCode.EC_OK および error_code != EnumErrorCode.EC_LICENSE_CACHE_USED の場合: print("ライセンスの初期化に失敗しました: エラーコード:", エラーコード、「、エラー文字列:」、エラーメッセージ) それ以外: cvr_instance = CaptureVisionRouter() 一方 (真): 画像パス = 入力( ">> 画像のフルパスを入力してください:\n" ">> 'Enter' でサンプル画像を表示するか、'Q'/'q' で終了します\n" )。ストリップ('\'"') if image_path. lower() == "q": システム終了(0) 画像パス == "" の場合: image_path = "../../../images/multi.png" os.path.exists(image_path) でない場合: print("画像パスが存在しません。") 続く 結果 = cvr_instance.capture( image_path、EnumPresetTemplate.PT_READ_BARCODES.value) if result.get_error_code() != EnumErrorCode.EC_OK: print("エラー:", result.get_error_code(), result.get_error_string()) それ以外: cv_image = cv2.imread(画像パス) items = result.get_items() print('{} 個のバーコードが見つかりました。'.format(len(items))) 項目内の項目の場合: format_type = item.get_format() テキスト = item.get_text() print("バーコード形式:", format_type) print("バーコードテキスト:", text) 場所 = item.get_location() x1 = location.points[0].x y1 = 位置.ポイント[0].y x2 = 位置.ポイント[1].x y2 = location.points[1].y x3 = 位置.ポイント[2].x y3 = 位置.ポイント[2].y x4 = location.points[3].x y4 = 位置.ポイント[3].y 位置情報の削除 cv2.drawContours( cv_image, [np.intp([(x1, y1), (x2, y2), (x3, y3), (x4, y4)])], 0, (0, 255, 0), 2) cv2.putText(cv_image, テキスト, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX、0.5、(0、0、255)、2) cv2.imshow( 「バーコードが検出された元の画像」、cv_image) cv2.waitKey(0) cv2.destroyAllWindows() input("終了するには Enter を押してください...")
class EnumPresetTemplate(Enum):
    PT_DEFAULT = _DynamsoftCaptureVisionRouter.getPT_DEFAULT()
    PT_READ_BARCODES = _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES()
    PT_RECOGNIZE_TEXT_LINES = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_TEXT_LINES()
    PT_DETECT_DOCUMENT_BOUNDARIES = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_DOCUMENT_BOUNDARIES()
    )
    PT_DETECT_AND_NORMALIZE_DOCUMENT = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_AND_NORMALIZE_DOCUMENT()
    )
    PT_NORMALIZE_DOCUMENT = _DynamsoftCaptureVisionRouter.getPT_NORMALIZE_DOCUMENT()
    PT_READ_BARCODES_SPEED_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_SPEED_FIRST()
    )
    PT_READ_BARCODES_READ_RATE_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_READ_RATE_FIRST()
    )
    PT_READ_SINGLE_BARCODE = _DynamsoftCaptureVisionRouter.getPT_READ_SINGLE_BARCODE()
    PT_RECOGNIZE_NUMBERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS()
    PT_RECOGNIZE_LETTERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_LETTERS()
    PT_RECOGNIZE_NUMBERS_AND_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_LETTERS()
    )
    PT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS()
    )
    PT_RECOGNIZE_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_UPPERCASE_LETTERS()
    )
注: LICENSE-KEY を有効なライセンス キーに置き換えます。

マルチバーコード画像を使用した Python バーコード リーダーのテスト

単一の画像から複数のバーコードをデコードすることは、小売業や物流業界で一般的な使用例です。次の画像には、さまざまな形式の複数のバーコードが含まれています:

How to Build a Python Barcode Scanner for Windows, Linux, and macOS

Webカメラを使用したリアルタイムのマルチバーコード検出

画像ファイルからバーコードを読み取るときは、メインスレッドで Capture() メソッドを呼び出します。ただし、Web カメラからのリアルタイム ビデオ ストリームを処理するには、メイン スレッドのブロックを避けるために別のアプローチが必要です。 Dynamsoft Capture Vision SDK は、リアルタイム ビデオ フレームを処理し、ネイティブ C ワーカー スレッドで非同期に処理するための組み込みメカニズムを提供します。これを実装するには、ImageSourceAdapter クラスと CapturedResultReceiver クラスを拡張して、それぞれ画像データとキャプチャ結果を処理し、start_capturing() メソッドを呼び出してビデオ ストリームの処理を開始します。


dynamsoft_capture_vision_bundle インポートから * インポートCV2 numpyをnpとしてインポート インポートキュー utils インポートから * クラス FrameFetcher(ImageSourceAdapter): def has_next_image_to_fetch(self) -> bool: Trueを返す def add_frame(self, imageData): self.add_image_to_buffer(imageData) クラスMyCapturedResultReceiver(CapturedResultReceiver): def __init__(self, result_queue): super().__init__() self.result_queue = 結果キュー def on_captured_result_received(self, Captured_result): self.result_queue.put(captured_result) __name__ == '__main__'の場合: errorCode、errorMsg = LicenseManager.init_license( 「ライセンスキー」) errorCode != EnumErrorCode.EC_OK および errorCode != EnumErrorCode.EC_LICENSE_CACHE_USED の場合: print("ライセンスの初期化に失敗しました: エラーコード:", errorCode, ", ErrorString:", errorMsg) それ以外: vc = cv2.VideoCapture(0) vc.isOpened() でない場合: print("エラー: カメラが開いていません!") 出口(1) cvr = CaptureVisionRouter() フェッチャー = FrameFetcher() cvr.set_input(フェッチャー) # キャプチャされたアイテムを保存するためのスレッドセーフなキューを作成します result_queue = キュー.Queue() レシーバー = MyCapturedResultReceiver(result_queue) cvr.add_result_receiver(受信者) errorCode、errorMsg = cvr.start_capturing( EnumPresetTemplate.PT_READ_BARCODES.value) errorCode != EnumErrorCode.EC_OK の場合: print("エラー:", errorMsg) True の場合: ret、フレーム = vc.read() ret でない場合: print("エラー: フレームを読み取れません!") 壊す fetcher.add_frame(convertMat2ImageData(frame)) そうでない場合は result_queue.empty(): Captured_result = result_queue.get_nowait() items = Capture_result.get_items() 項目内の項目の場合: if item.get_type() == EnumCapturedResultItemType.CRIT_BARCODE: テキスト = item.get_text() 場所 = item.get_location() x1 = location.points[0].x y1 = 位置.ポイント[0].y x2 = 位置.ポイント[1].x y2 = location.points[1].y x3 = 位置.ポイント[2].x y3 = 位置.ポイント[2].y x4 = location.points[3].x y4 = 位置.ポイント[3].y cv2.drawContours( フレーム、[np.intp([(x1, y1), (x2, y2), (x3, y3), (x4, y4)])], 0, (0, 255, 0), 2) cv2.putText(フレーム, テキスト, (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) 位置情報の削除 cv2.waitKey(1) & 0xFF == ord('q') の場合: 壊す cv2.imshow('フレーム', フレーム) cvr.stop_capturing() vc.release() cv2.destroyAllWindows()
class EnumPresetTemplate(Enum):
    PT_DEFAULT = _DynamsoftCaptureVisionRouter.getPT_DEFAULT()
    PT_READ_BARCODES = _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES()
    PT_RECOGNIZE_TEXT_LINES = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_TEXT_LINES()
    PT_DETECT_DOCUMENT_BOUNDARIES = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_DOCUMENT_BOUNDARIES()
    )
    PT_DETECT_AND_NORMALIZE_DOCUMENT = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_AND_NORMALIZE_DOCUMENT()
    )
    PT_NORMALIZE_DOCUMENT = _DynamsoftCaptureVisionRouter.getPT_NORMALIZE_DOCUMENT()
    PT_READ_BARCODES_SPEED_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_SPEED_FIRST()
    )
    PT_READ_BARCODES_READ_RATE_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_READ_RATE_FIRST()
    )
    PT_READ_SINGLE_BARCODE = _DynamsoftCaptureVisionRouter.getPT_READ_SINGLE_BARCODE()
    PT_RECOGNIZE_NUMBERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS()
    PT_RECOGNIZE_LETTERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_LETTERS()
    PT_RECOGNIZE_NUMBERS_AND_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_LETTERS()
    )
    PT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS()
    )
    PT_RECOGNIZE_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_UPPERCASE_LETTERS()
    )

説明

    FrameFetcher クラスは、組み込みバッファにフレーム データをフィードするための ImageSourceAdapter インターフェイスを実装します。
  • MyCapturedResultReceiver クラスは、CapturedResultReceiver インターフェイスを実装します。 on_captured_result_received メソッドはネイティブ C ワーカー スレッドで実行され、CapturedResult オブジェクトをメイン スレッドに送信し、その後の使用のためにスレッドセーフ キューに保存されます。
  • CapturedResult には、複数の CapturedResultItem オブジェクトが含まれます。 CRIT_BARCODE タイプは、認識されたバーコード データを表します。
macOS での Python バーコード スキャナーのテスト

How to Build a Python Barcode Scanner for Windows, Linux, and macOS

ソースコード

https://github.com/yushulx/python-barcode-qrcode-sdk/tree/main/examples/official/10.x

リリースステートメント この記事は次の場所に転載されています: https://dev.to/yushulx/how-to-build-a-python-barcode-scanner-for-windows-linux-and-macos-15d?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3