VintaSoft Barcode .NET SDK を使用して郵便バーコードを認識する

ブログ カテゴリ: バーコード.NET

2026/04/07

郵便バーコードは、現代の物流の重要な要素となっています。郵便バーコードにより、手紙や小包の自動仕分け、出荷の追跡、手作業の最小化が可能になります。以下では、さまざまな種類の郵便バーコード、それらを認識する際に遭遇する課題、および VintaSoft Barcode .NET SDK を使用して .NET アプリケーションで郵便バーコードを認識する方法について説明します。


郵便バーコードが必要な理由

郵便バーコードは、物理的なアイテムを情報システムのレコードにリンクする機械で読み取り可能なラベルです。短いバーまたはドットのセット 1 つに、ビジネスと物流にとって重要なデータが隠されています。

通常、郵便バーコードは、次の目的で使用されます。

これらのラベルがなければ、手紙や小包の大量処理は不可能です。バーコードスキャンの適切な実装は、仕分け速度、サービス品質、およびオペレーターのコストに直接影響します。


郵便バーコードの主な種類

世界中で数十の標準が使用されていますが、独自のスキャンシステムを作成するには、少なくとも基本的なグループを理解することが重要です。

4状態郵便バーコード(4状態)

これは、各バーがベースラインに対して高さと位置の4つの状態のいずれかを持つ特殊なクラスのバーコードです。このバーコードセットのバーコードは、米国、英国、オーストラリア、日本、およびその他の国の主要な郵便事業者によって使用されています。これらのバーコードは通常、送信者の識別子、サービスの種類、固有のアイテム番号、ルーティング情報を含み、比較的コンパクトです。


リニアバーコード (1D)

多くの物流会社や郵便会社は、インターリーブド 2 of 5 (ITF)、コード 128、その他の一次元バーコードなどの馴染みのある形式を使用しています。これらはステッカーや配送ラベルに簡単に貼付でき、スキャナーで簡単に読み取ることができ、ほぼすべてのバーコード認識 SDK でサポートされています。


二次元コード (2D)

データマトリックスと QR コードは、郵便業界でますます一般的になっています。これらは、機械で支払った切手、複合郵便ラベル、追跡機能を強化するための追加ステッカーに最もよく見られます。2D バーコードは、リニア バーコードよりも多くのデータを保持でき、部分的に損傷しても通常は読み取り可能です。


実際のシステムでは、これらのオプションの任意の組み合わせに遭遇する可能性があります。したがって、.NET アプリケーション用に選択する SDK は、少なくとも郵便事業者または物流パートナーが使用する形式をサポートしている必要があります。


郵便バーコード認識の課題

理論上、バーコード認識は簡単な作業です。実際には、郵便の状況により、開発者やアルゴリズムにとって非常に困難な作業となります。

最も一般的な問題:

これらの要因により、最も単純なアルゴリズムと基本設定だけに頼ることは許容できません。柔軟で干渉に強いエンジンと、バーコード認識パラメータを微調整する機能が必要です。 .NET プロジェクトでは、この役割は VintaSoft Barcode .NET SDK で果たすことができます。


バーコード スキャン用のハードウェア オプション

郵便バーコードのスキャンは、さまざまな種類のデバイスに基づいて行うことができ、ソリューション アーキテクチャは選択によって異なります。

一般的なアプローチは、既製のハードウェア バーコード スキャナを使用することです。これらは、ハンドヘルド、組み込み、または固定デバイスです。これらは高速で信頼性が高く、24 時間 7 日稼働するように設計されており、多くの場合、基本的なバーコードの種類を独立してデコードできます。ただし、このようなデバイスは最新のモバイル アプリケーションや Web アプリケーションとの統合性が低く、サポートされるフォーマットの拡張はメーカーのファームウェアに依存します。

別のアプローチとして、汎用カメラを使用してソフトウェアで画像を処理する方法があります。この場合、「スキャナー」はスマートフォンのカメラ、タブレットのカメラ、ウェブカメラ、コンベアベルト上の産業用カメラ、または標準のドキュメント スキャナーでも構いません。バーコード認識は、.NET アプリケーションに組み込まれたライブラリによって実行されます。これは、VintaSoft Barcode .NET SDK シナリオの動作とまったく同じです。検索するバーコード、画像の処理方法、結果をシステムに統合する方法を制御できます。


VintaSoft Barcode .NET SDK の機能

VintaSoft Barcode .NET SDK は、.NET エコシステムにおけるバーコード認識および生成のためのプロフェッショナル ツールです。以下の機能は、郵便物流にとって特に重要です。

まず、VintaSoft Barcode .NET SDK は、幅広いバーコードをサポートしています。これには、4 つの州の郵便バーコード、および封筒、小包、切手、物流ラベルで使用される一般的な線形バーコードと 2D バーコードが含まれます。これにより、単一のソリューションで、内部の郵便マーキングとパートナー配送サービスのバーコードの両方を処理できます。

次に、VintaSoft Barcode .NET SDK は、複雑な実世界の画像を処理するように設計されています。アルゴリズムは、ノイズ、傾き、印刷が不完全で、フレーム内のバーコードのサイズが小さい。これは、オペレーターが携帯電話で小包を撮影する場合や、コンベアカメラが理想的でないビデオを生成する場合に重要です。

3つ目に、開発者は柔軟な設定を利用できます。検索するバーコードタイプのリストを指定したり、速度と品質を優先したり、検索領域を関心のある矩形に制限したり、1つの画像内のコードの予想数を指定したりできます。このカスタマイズにより、SDKを特定の仕分けライン、メディアタイプ、およびオペレーターのワークフローに適応させることができます。

最後に、VintaSoft Barcode .NET SDKは、さまざまな種類の.NETアプリケーションに簡単に統合できます。ライブラリは、最新バージョンの.NETで構築されたデスクトップソリューション、サーバーサービス、Webサービス、およびモバイルアプリケーションで使用できます。これにより、企業のITシステム全体で統一されたバーコード認識アーキテクチャを構築できます。


郵便バーコードをスキャンする手順

VintaSoft Barcode .NET SDK を使用して .NET アプリケーションに実装する典型的なワークフローを見てみましょう。

1. まず、封筒または小包の画像を取得する必要があります。これは、アップロードされたファイル、スキャンされたドキュメント、ビデオ ストリームからの別のフレーム、またはモバイル デバイスのカメラで撮影した写真である可能性があります。このステップでは、バーコードが十分な数のピクセルを占め、拡大縮小時に失われないように、画像のサイズと品質を制御することが重要です。

2. 次に、サポートされているバーコード タイプのセットを選択します。たとえば、4 ステートの郵便バーコード、1 または 2 つの ITF タイプ、および、キャリアが使用する Data Matrix バーコードを指定できます。この制限により、ランダムなパターン、テクスチャ、アーティファクトによる速度の向上と誤検出の低減が実現します。

3. 次に、実際のバーコード認識が行われます。アプリケーションは VintaSoft Barcode .NET SDK API を呼び出し、画像を渡すと、検出されたバーコードのコレクションが返されます。ライブラリは、各結果に対して、バーコードの種類、文字列値、画像領域の座標、および多数の追加パラメータを返します。たとえば、画像に郵便番号と運送業者の物流バーコードの両方が含まれている場合、1 つの呼び出しで複数のバーコードを一度に返すことができます。

4. 次のステップは、受信したデータの分析と検証です。文字列値は、郵便事業者の内部フォーマットに従って解析されます。そこから、郵便番号、固有の出荷番号、顧客 ID、サービス コード、およびその他の論理フィールドを抽出できます。このレベルでは、長さと構造の検証、データベースのマッチング、チェックデジットの検証、および必要に応じて機密データ部分のマスキングまたは暗号化が実装されます。

5. 最終ステップは、結果をビジネスロジックと統合することです。認識されたデータは、出荷ステータスの更新、ルートの自動生成、および受入、仕分け、発行操作の記録に使用されます。オペレーターインターフェースは、バーコード領域を視覚的に強調表示できます。詳細な説明を表示し、信頼度が低い場合は再スキャンを提案します。


実用的な構成の推奨事項

VintaSoft Barcode .NET SDK を使用して郵便バーコードを信頼性が高く高速にスキャンするには、いくつかの実用的な点を考慮すると便利です。

まず、可能であれば、認識されるバーコード形式のリストを実際に使用されているバーコードの種類のみに制限します。これにより、処理時間が短縮され、ノイズやロゴの一部が別のバーコードの種類として誤って解釈される可能性が低くなります。

次に、検索領域を慎重に選択します。バーコードが封筒またはラベルの特定の領域にほぼ常に印刷されている場合は、関心のある矩形を定義し、その領域のみを分析します。この手法は、大きな画像を処理する場合やビデオ ストリームを扱う場合に特に役立ちます。

3番目に、速度と品質のプロファイルをテストします。スループットが重要な高負荷仕分けセンターでは、SDK を最大認識速度に設定し、通常の損傷のないバーコードに焦点を当てることができます。法的に重要な出荷と多数の問題のあるラベルを含むシナリオでは、より徹底的な分析モードを有効にすることが理にかなっています。

4 番目に、撮影条件を忘れないでください。最も高度な SDK であっても、完全な暗闇やランプやディスプレイケースからの強いグレアを補正することはできません。オペレーター インターフェイスには、カメラ ガイダンス、照明レベルの表示、自動ズーム、バーコード 領域の切り抜きを含めることができます。これらすべてが VintaSoft Barcode .NET SDK の機能と組み合わさることで、最終的に正常に読み取られた郵便バーコードの割合が大幅に増加します。

結論

郵便バーコードのスキャンと分析は、「画像内のストライプを認識する」だけではありません。このタスクには、多様なフォーマット、不完全な印刷・撮影条件、高いデータスループット、そして大量のデータを正確に処理する必要性など、複雑な要件が伴います。VintaSoft Barcode .NET SDKのような専用の.NETソリューションを使用することで、ビジネスロジックに集中し、画像処理、デコード、および基本的な検証は実績のあるツールに任せることができます。SDKを適切に構成し、実際の手紙や小包のサンプルで徹底的にテストすることで、郵便物流の最新の追跡と自動化の基盤となる信頼性の高いシステムを構築できます。


カメラ画像内の郵便バーコードを認識する方法を示す C# コードを以下に示します。
/// <summary>
/// Recognizes postal barcodes from a <see cref="System.Drawing.Bitmap"/>.
/// </summary>
/// <param name="bitmap">A bitmap with barcodes.</param>
public static void RecognizePostalBarcodesFromBitmap(System.Drawing.Bitmap bitmap)
{
    // create barcode reader
    using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
    {
        // specify that barcode reader must search for Postnet barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Postnet;
        // specify that barcode reader must search for Planet barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Planet;
        // specify that barcode reader must search for Intelligent Mail barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.IntelligentMail;
        // specify that barcode reader must search for Australian Post barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.AustralianPost;
        // specify that barcode reader must search for Japan Post barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.JapanPost;
        // specify that barcode reader must search for Dutch KIX barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.DutchKIX;
        // specify that barcode reader must search for Royal Mail barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.RoyalMail;
        // specify that barcode reader must search for Royal Mail Mailmark 4-state barcode C barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Mailmark4StateC;
        // specify that barcode reader must search for Royal Mail Mailmark 4-state barcode L barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Mailmark4StateL;

        // specify that barcode reader must search for Deutsche Post Identcode barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.DeutschePostIdentcodeBarcodeSymbology);
        // specify that barcode reader must search for Deutsche Post Leitcode barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.DeutschePostLeitcodeBarcodeSymbology);
        // specify that barcode reader must search for DHL AWB barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.DhlAwbBarcodeSymbology);
        // specify that barcode reader must search for FedEx Ground 96 barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.FedExGround96BarcodeSymbology);
        // specify that barcode reader must search for Italian Post 2 of 5 barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.ItalianPost2of5);
        // specify that barcode reader must search for Royal Mail Mailmark CMDM Type29 2D barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.MailmarkCmdmType29BarcodeSymbology);
        // specify that barcode reader must search for Royal Mail Mailmark CMDM Type7 2D barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.MailmarkCmdmType7BarcodeSymbology);
        // specify that barcode reader must search for Royal Mail Mailmark CMDM Type9 2D barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.MailmarkCmdmType9BarcodeSymbology);
        // specify that barcode reader must search for Swiss PostParcel barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.SwissPostParcelBarcodeSymbology);
 
        // read barcodes from image
        Vintasoft.Barcode.IBarcodeInfo[] infos = Vintasoft.Barcode.GdiExtensions.ReadBarcodes(reader, bitmap);

        // if barcodes are not detected
        if (infos.Length == 0)
        {
            System.Console.WriteLine("No barcodes found.");
        }
        // if barcodes are detected
        else
        {
            // get information about extracted barcodes

            System.Console.WriteLine(string.Format("{0} barcodes found:", infos.Length));
            System.Console.WriteLine();
            for (int i = 0; i < infos.Length; i++)
            {
                Vintasoft.Barcode.IBarcodeInfo info = infos[i];
                System.Console.WriteLine(string.Format("[{0}:{1}]", i + 1, info.BarcodeType));
                System.Console.WriteLine(string.Format("Value:      {0}", info.Value));
                System.Console.WriteLine(string.Format("Region:     {0}", info.Region));
                System.Console.WriteLine();
            }
        }
    }
}