実現したいこと
用紙上の項目を検出する作業を行っていますが、100枚につき10数枚ほど誤検出があります。
検出に至るまでの処理を精査して、標準的な方法?やより良い方法があれば、
ご教授いただきたく思います。
当方、画像処理にあまり詳しくないこともあり、追加質問させていただくことがあると思います。
よろしくお願い致します。
環境
Windows10
C#(VisualStudio2015、.NetFramework4.5.2)、OpenCVSharp3、GhostScript.Net、QR Code Decode Library
現在の処理内容
※長いです。
1.用紙について
用紙はA3横向きで、左下と右上にQRコードが印字されており、JPEGまたはPDFファイルで提供されます。
2.画像抽出~補正処理
2-1 JPEG保存
JPGやPDFはスキャナより作成されます。※スキャナである程度傾き補正済み
JPG(200dpi)はそのまま処理し、PDF(200dpi)はGhostScriptを用いてJPG(96dpi)に変換します。96dpiで出力するのは処理全体のレスポンスとの兼ね合いです。
2-2 QRコード検出
OpenCVSharpと「QR Code Decode Library」を用いて、QRコードの検出をします。
この際QRの四隅の座標が取れるのですが、結ぶと長方形ではなく四角形になることがあります。
左下QRの左下、右上QRの右上の座標よりQRで囲まれた長方形(QR枠)を形成します。
QR枠の左上の座標を基準点とし、2-3.回転補正後に、別途定義済みの情報(ひな形)より、
QR枠内の項目を読み取ります。
2-3 回転補正
スキャナの傾き補正後も微小な傾きが残る場合があります。※図は大袈裟に傾けてあります。
ひな形(赤)と読込画像(青)のQR枠のアスペクト比を各々算出し、差を取得します。
差が0.007以上の場合は、高確率で結果に位置ズレが生じるので回転補正を行います。
※0.007未満の場合は補正しません。
OpenCVのHoughLinesPにて直線の検出を行います。
C#
1Mat edge = new Mat(元画像.Size(), MatType.CV_8U) 2Cv2.CvtColor(元画像, edge, ColorConversionCodes.BGR2GRAY) 3Cv2.Canny(edge, edge2, 25, 50); 4lines = Cv2.HoughLinesP(edge2, 1, Math.PI / 180, 100, 150, 15); 5double radian = Math.Atan2(ln.P2.Y - ln.P1.Y, ln.P2.X - ln.P1.X) * (180 / Math.PI)
大体下図のような線分群が取得できますが、文字等も拾うため、角度が1度以上の線は捨てて、平均値を角度とします。※スキャナの自動補正で1度未満の傾きが多いため。
回転に関してはGraphicsオブジェクトを利用しています。
C#
1g.RotateTransform(angle * -1F);
回転後の画像に対して、2-3の冒頭に戻り処理を行い結果の画像を得ます。
回答1件
あなたの回答
tips
プレビュー