15
24

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 5 years have passed since last update.

【ZXing.Net】C#でQRコードの読取

Last updated at Posted at 2018-08-30

#C#でQRコードを読みたい
色々調べましたところ、C#でそこそこ使えそうなQRコードライブラリとしては2つくらいに絞れそうでした。
その中からZXing.Netを採用して実験

##準備
環境はVisualStudio 2017
nugetパッケージマネージャから以下コマンド実行

Install-Package ZXing.Net -Version 0.16.4

##簡易な読取


//QRコードの映った画像ファイルからビットマップを生成する

//var img = new Bitmap(filename);
//とすると、imgをDisposeするまで
//プロセスが読み込んだビットマップファイルを掴んだままになってしまいます。
//filestreamで読み込むとこの現象を避けられます。
System.IO.FileStream fs = new System.IO.FileStream(
                filename,
                System.IO.FileMode.Open,
                System.IO.FileAccess.Read);
            System.Drawing.Image img = System.Drawing.Image.FromStream(fs);
            fs.Close();
// QRコードの解析
ZXing.BarcodeReader reader = new ZXing.BarcodeReader();
//ZXingに渡すのはBitmap
ZXing.Result result = reader.Decode(new Bitmap(img));

//これでQRコードのテキストが読める
var text = result == null ? string.Empty : result.Text;
//因みにresult.BarcodeFormatでコード種類が取れます。
//QRコードならZXing.BarcodeFormat.QR_CODEのはずです。

##実験
文字列「1234567890」をZxingでエンコードした画像を用意しました。

// QRコードを生成するエンコーダ
var encoder = new ZXing.QrCode.QRCodeWriter();
//ここでQRコードのオプションが色々指定できるようです。
var encodeHints = new Dictionary<EncodeHintType, object>()
{
    { EncodeHintType.CHARACTER_SET, "shift_jis" },
    { EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.M }
};

var writer = new BarcodeWriter();
//このimageを画像として吐き出します。
var image = writer.Write(
    encoder.encode(
        "1234567890",//エンコードする文字列
        ZXing.BarcodeFormat.QR_CODE, //ここで指定を変えればバーコードなども作れる模様
        400, 400, //width*heght
        encodeHints
        )
    );

StopWatchで処理時間を計測してみました。
デバッグ実行しましたので実際はもう少しパフォーマンス出るかも知れません。

###きれいなQRコードを読み込んでみる
QRTEST_0.png

読取結果

回数 処理時間[ms] 備考
1 399 起動後初回
2 6
3 107 起動後初回
4 6
5 25
6 25
7 22

起動後にはインスタンス生成の為か時間がかかる傾向があります。
その次はやたら速い・・・。
キャッシュしてるのでしょうか。
その次からは20ms中盤に落ち着きつつあるように見えます。

###ぼやけたQRコードを読ませてみる
100*100Pixにサイズダウンし、OpenCVSarpでガウシアンフィルタをかけた画像を用意。

//imageは上で生成したQRコードです。
//この時サイズは100*100にして実験してました。(上では400*400になってますが)
var imageMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(image);
var filterSize = 5;//ここで1,3,5,7と変更しました。
//偶数はガウシアンフィルタの原理上指定できないようです。
//偶数を指定するとExceptionが発生します。
imageMat = imageMat.GaussianBlur(new OpenCvSharp.Size(filterSize, filterSize), 0);
//ビットマップに戻します
var filterResult = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(imageMat);

フィルタサイズを1*1から大きくしていってどこまで読めるのか・・・。

サイズ 読取結果
1*1 OK
3*3 OK
5*5 OK
7*7 NG

5*5の画像はこんな感じでした。
QRTEST_gaussian.png

7*7の画像
QRTEST_gaussian_NG.png

5*5でも読めることに驚きました。

###傾いたQRコードを読ませてみる X方向
X方向の縮尺のみ小さくして傾きを模擬しました。
どこまで読めるのか・・・。
結果76%までは読めました。
ArcCOS(0.76) ≒ 40deg

QRTEST_2_X73.png

###傾いたQRコードを読ませてみる Y方向
同様にY方向も。
こちらは57%まで読めました。

ArcCOS(0.57) ≒ 55deg
QRTEST_3_Y59.png

この角度までいくと遠近の補正が無くていいのか不安になりますね。
もっと傾きには弱いと思ってましたが、かなり傾いても輪郭がはっきりしていれば読めそうです。
この画像もグレーが混じり始めてしまっているのでその影響のほうが大きいのかもしれません。
もっと画素数を上げてやらないとですかね・・・?

15
24
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
15
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?