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

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

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

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

OpenCV

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

アルゴリズム

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

Q&A

解決済

1回答

1497閲覧

縦横を伸縮した四角形内の位置指定

nakanori773

総合スコア4

C#

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

OpenCV

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

アルゴリズム

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

0グッド

0クリップ

投稿2020/09/03 03:40

C#、OpenCV(OpenCVSharp) にて、スキャンした用紙上の領域抽出を行っています。

<図1 四角形内の位置抽出>
基本

図1のように、
2点より四角形を形成して、内部にある領域を抽出します。
四角形を形成する前に、用紙内の罫線(図の赤線)を元に回転しておきます。

スキャンする際に多少の斜行があるので、回転を行うのですが、
きれいな水平にならず、少し斜めの場合があります。

<図2 斜行が残った状態での四角形の検出>
図2 斜行が残った状態での四角形の検出

その場合、図2のように縦横伸縮した四角形が検出されます。
※図2は説明の為、極端に傾けています。実際はもっと傾きは少ないです。

<図3 縦横比で計算>
図3 縦横比で計算

元々の四角形と比較して四角形内の検出を行いますが、
微少なズレが残るため縦横のズレの程度(長さの差)で、追加で検出位置を上下左右に調整しています。

発生している問題

現在の方法では、追加の検出位置の上下調整をおこなうため、
開発・テストの中で、どうしてもズレが発生した時点で対応する感が否めません。
また、対応として後手後手となりまず。

同様・類似の問題点の対応方法はありますでしょうか?

概念的な問題で、質問がふわふわした感じで申し訳ございません。

補足情報

当方、初めて利用を致しますので、質問に慣れておりません。。。
改善・確認ポイントも幾つかあるかもしれません。

ソースコードも必要に応じて提示できると思います。

よろしくお願いいたします。

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

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

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

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

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

fana

2020/09/03 04:18 編集

> 2点より四角形を形成して… その2点は誰がどうやって与えるのでしょうか? この点の個数を増やすことはできないのでしょうか? 事前にスキャンした画像を回転させて補正しているという話に見えますが, その回転による補正の精度が悪いことが問題である(ここでうまく回転させれば後段の検出処理時には問題がない)という話ならば… 回転量の決定のために現状用いている「罫線」の他にも利用可能な罫線やその他の何かが存在するようなことはないのでしょうか?
nakanori773

2020/09/03 05:05

fana さん ご返答頂きありがとうございます。 2点に関しては、元々用紙に印刷されているものを用いています。 点の増減に関しては、用紙の印刷内容の変更になるため、実現度合いがわかりません。 状況をご理解いただき、ありがとうございます。 傾きがほぼ0に関しては、縦横とも伸縮に問題はありません。 罫線の他に利用できそうなものを探してみます。 用紙上に罫線は沢山あるので、OpenCVの「HoughLinesP」で複数検出して、 傾きの平均値を出しているので、精度に多少バラツキもあります。
guest

回答1

0

ベストアンサー

※図2は説明の為、極端に傾けています。実際はもっと傾きは少ないです

と,

用紙上に罫線は沢山ある

という話から,例えば以下のような簡単な処理で補正用の回転量を求めるとしたら,現状よりも改善するかどうかを見てみたらどうでしょうか.

  1. Sobelフィルタあたりで各画素のエッジ強度と勾配方向を求む
  2. エッジ強度が一定以上あり,且つ,回転量の推定に用いる「罫線」の理想的な角度(多分,{縦線,横線}のいずれかあるいは両方,かな)にある程度近い勾配方向を持つ画素群に関して,勾配方向のヒストグラム(度数分布)を作る.
  3. 2.の結果として,「罫線」のエッジに相当する方向が優位に大きくなるだろうから,そこから回転量を決定する

現状行われているハフ変換を用いた方法との違いは,
各エッジ点から「傾き」を求めてその多数決によって回転量を直接的に決定するところです.

投稿2020/09/03 06:05

編集2020/09/03 06:12
fana

総合スコア11656

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

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

fana

2020/09/03 06:29 編集

Sobelフィルタで計算した輝度勾配方向を「その点(を通る直線)の法線方向の推定値」として用いるという話. おそらく 3x3 のフィルタでも使用に耐える結果が得られるのではないかとは思いますが, この法線方向の推定値に不安がある場合には,フィルタを5x5とかにしてみるとか,あるいは近傍画像への直線当てはめ等によって決定する等しても良いかもしれません. ヒストグラムは細かさをどうするのかという点で少しばかりのチューニングが必要かもしれません. 複数の近隣のbinに値がばらけるような場合には,Step3で結果を求める前に,ヒストグラムをかるく「ぼかす」と良いかもしれません. 縦線と横線の両方を用いるならば,Step3では,あるbinとそれに直交する角度に相当するbinの値の合計が最大になるようなbinを見つければよい,という話になるかと. この方法で求めた回転量をそのまま画像の補正に用いるのではなくて, 例えば,Step3で選ばれたbinに投票した画素群だけを用いて,別の手段で回転量を計算するようなことを考えても良いかもしれません.
nakanori773

2020/09/03 06:33

fana さん ご回答ありがとうございます。 一度、実施してみます。 また色々調べてもわからない点があれば、追加でご質問するかもしれません。
nakanori773

2020/09/28 07:59

fanaさん ご返事が遅くなりまして、申し訳ございません。 色々と試行・検討したのですが、私の理解力の不足もあり、 「そもそも画像処理上、この質問に辿りつくまでの処理が正しいのか?」 という話になり、別途質問を投稿することになりました。 ご助力頂いたのに申し訳ございません。 この質問はクローズ(解決済み?)にさせていただきます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問