質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

5278閲覧

画像処理の流れについて(用紙上の項目の検出)

nakanori773

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2020/09/28 09:50

実現したいこと

用紙上の項目を検出する作業を行っていますが、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の冒頭に戻り処理を行い結果の画像を得ます。
イメージ説明

3.項目の検出
ひな形(赤枠)から、対象の画像(緑枠)に縦比・横比を用いて目的の項目(点線枠)を検出します。
イメージ説明

結果、アスペクト比が近ければ、問題ないのですが、一定以上ズレると項目のズレが生じます。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/09/28 10:36 編集

> 100枚につき10数枚ほど誤検出 その うまくいかない結果を生じる画像において,現行処理では何故結果がずれるのか? ということを精査すべきです. 画像入力~結果領域の推定 までの中に,話の理想通りに物事が運ばないステップが1つ以上存在しているハズですから,どのステップがなぜ理想とは異なる結果になってしまうのか? という原因を把握して下さい. (回転を補正しきれないことが問題なのであれば,何故補正しきれないのか? という要因を明確にしなければなりません.)
yuki23

2020/09/28 15:33

結局の所、質問は何でしょうか? 現状では丸投げのように見えます。
Zuishin

2020/09/28 21:46

> ※スキャナである程度傾き補正済み これをやめたら正確性が増しそうな気がします。 スキャナによる補正で見た目は整いますが、データが変形します。 傾きやアスペクト比を自前で補正するなら、余計な処理でしかありません。
nakanori773

2020/09/28 21:48

ご返答頂きありがとうございます。 fana さん ご指摘の通りですね。。。 現在並行して各ステップの確認も行っております。 yuki23さん 漠然としていて申し訳ございません。 例えば、以下のようなことが気になっています。 ・アスペクト比を軸に処理を展開していますが、方針に問題はないのか? ・今回のようなレイアウトの用紙に対して、各ステップのような方法はあまり好ましくない、別の方法もある。。。など。 fanaさんのご指摘にもあるとおり、ポイントが絞り切れていない状態で、打開策を模索しています。
nakanori773

2020/09/28 21:55

zuisinさん ご返答頂きありがとうございます。 一度確認してみます。 自前での回転処理に関して気になるのは、以下のようなことです。  1.回転できていない雰囲気がある(回転後、同じ角度が検出される場合がある)  2.角度が揺れながら回転を重ねる場合がある(3歩進んで2歩下がるような感じ) これは線検出にも関係しているとは思いますが。。。
Zuishin

2020/09/28 21:59

ではそこを直さなければどうにもなりません。今までスキャナの補正頼りで、自前の補正は効いていなかったことになります。
guest

回答1

0

ベストアンサー

まずは,初っ端で行う QR検出による「右上」「左下」の2点の検出 の精度がどの程度なのか?
というのを見るべきでしょう.
発端となっているそのデータの誤差が大きいと,

  • 本当は後段の補正が必要なのにしない
  • 処理を繰り返し行うことの意味がなくなる(毎回無視できない量の独立したずれを生じるならば繰り返す意味が無い)

といった話を生じるでしょう.

もしもこの2点の検出精度が十分であるならば……
「傾いているかどうか」を見る指標を「アスペクト比」と表現されていますが,要は,これは2点を結ぶ線の角度のtanを見ているわけで,
であれば,そこからダイレクトに「傾き」を推定できる可能性もあるのでは.
(とはいえ理想論すぎて,実際にこれを補正量の拠り所とするにはロバストさの観点で微妙な気はするが)

#あと,QRの検出処理自体から傾き量は得られないのだろうか?


役に立たない話かも:

質問内に提示された図を見ると,最終的な領域を決める際の基準位置(枠の左上)というのが,何か画像的な特徴が存在する位置ではなくて,上記QRによる2点から計算で求められた(言わば補外された)座標であるように見える.
そこは(感覚的な話で,理屈的にうまく言えないけれども)かなり「弱い」方法に思える.
自分なら,基準座標は画像的特徴がある場所とし,それを直接検出する.

※おそらくこの左上の基準点というのは「回転が完全に除去できたつもりの画像」の上で検出した右上点のyと左下点のxを用いて(x,y)と推定するのだと思う.
そうであれば,画像の回転除去が完璧でない場合,この左上の座標自体に変なオフセットが生じるハズ.
「最後の補正結果画像でも回転は完全には除去できていないであろう」という話の上でちゃんと2軸の方向を推定して,それを用いるならばOK.

投稿2020/09/29 01:18

編集2020/09/29 01:38
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakanori773

2020/10/13 05:22

プリンタの自動補正の有無と、QRの精度を確認した結果、 プリンタの自動補正を有効にすることで、 10ピクセル未満の誤差であることがわかりました。 また、またプリンタの機種ごとにズレの発生する確率も違いました。 皆さまのご助力を元にもう少し状況を絞り込んでいきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問