1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】荒い画像からQRコード読み取り

Posted at

初投稿です。

以下の記事を参考にQRコード読み取りの案件があったので、実装しました。
【ZXing.Net】C#でQRコードの読取

ぼやけたQRコードや、少し斜めったQRコードも読み取れるように改造した内容です。

実装途中、以下のようなメモリリークしたり、画像ファイルのアクセス不正とかで嵌ったので、メモとして残しました。
OpenCvSharp で Mat を返すメソッドを使うとメモリリークで死ぬ件

Nugetパッケージのインストール

Nugetで「OpenCvSharp3」と「Zxing.Net」をインストールします。
nuget.png

コード

    public void qrRead(string filename)
    {
        //filename:画像ファイルパス(例:c:\\gazo.jpg)

        /// 画像フィルタリングのフィルタ値
        /// この値を上げると精度が上がっていくが、処理時間も増加する。
        /// ※適宜変更してください。
        const int maxFilterSize = 10;

        //画像ファイルをBitmapに変換
        System.Drawing.Image image = System.Drawing.Image.FromFile(filename);
        Bitmap myBitmap = new Bitmap(image);
        string data = string.Empty;

        //Mat形式に変換
        using (Mat imageMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(myBitmap))
        {

            // QRコードの解析クラス
            ZXing.BarcodeReader reader = new ZXing.BarcodeReader();

            //画像フィルタリングのフィルタ値まで、ループ
            for (int i = 0; i < maxFilterSize; i++)
            {
                //奇数にする必要があるので、さらに加算
                i++;

                //偶数を指定するとExceptionが発生するので注意。
                int filterSize = i;

                //別変数のMATにとる
                using (Mat imageMatFilter = imageMat.GaussianBlur(new OpenCvSharp.Size(filterSize, filterSize), 0))
                {
                    //ビットマップに戻す
                    using (Bitmap filterResult = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(imageMatFilter))
                    {
                        //QRコードの解析
                        ZXing.Result result = reader.Decode(filterResult);
                        if (result != null)
                        {
                            //変数に退避
                            data = result.Text;
                        }
                    }
                }

                if (!string.IsNullOrEmpty(data))
                {
                    Console.WriteLine(data); //読み取り内容を出力
                    return;
                }
            }
        }

        Console.WriteLine("読み取れない!");

    }
}

このメソッド単体で動くはず。
読み取り精度を上げたい場合は、「maxFilterSize 」の値を増やすといい感じだけども、処理時間も増える。。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?