初投稿です。
以下の記事を参考にQRコード読み取りの案件があったので、実装しました。
【ZXing.Net】C#でQRコードの読取
ぼやけたQRコードや、少し斜めったQRコードも読み取れるように改造した内容です。
実装途中、以下のようなメモリリークしたり、画像ファイルのアクセス不正とかで嵌ったので、メモとして残しました。
OpenCvSharp で Mat を返すメソッドを使うとメモリリークで死ぬ件
Nugetパッケージのインストール
Nugetで「OpenCvSharp3」と「Zxing.Net」をインストールします。
コード
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 」の値を増やすといい感じだけども、処理時間も増える。。