2009-06-25 10 views
7

長方形のパースペクティブを自動的に修正するプログラムを作成しようとしています。私は四角形のシルエットを取得し、パースペクティブを修正するコードを持っていますが、コーナーを見つけることはできません。変形された長方形の角を見つける

c1 = min(x), min(y) 
    c2 = max(x), min(y) 
    c3 = min(x), max(y) 
    c4 = max(x), max(y) 

これは、このような状況では動作しませんが、(Xがコーナーを表します):

X0000000000X 
.00000000000 
..X000000000 
.....0000000 
........0000 
...........X 
最大の問題は、それが変形されているので、私は、次の「コード」を使用することができない、ということです

誰でもこれを行う方法を知っていますか?

+0

なぜあなたは仕事をしていませんか?実際の最大値と実際の最小値を見つける必要があります(実際に最大値と最小値を決める前にすべての点を調べることによって)が、ある時点であなたに伝えるデータの一部に頼らざるを得なくなります矩形はどのように見えますか? –

+0

コーナーのポイント座標を持たずに、どのように矩形のシルエットを取得しましたか? – Stewbob

+0

私は入力として画像を持っています、私は背景から興味深い部分を分離することができますスレッシュホールド機能を備えています。 – dutchflyboy

答えて

5

センターから最も遠いポイントが1つのコーナーになります。 最初のコーナーから最も遠いポイントは、もう1つのコーナーを提供します。 これらの2つのコーナーの間の線から最も遠いポイント(より多くの数学的な感受性)は、3番目のコーナーを与えます。私はタイブレーカーとしてセンターからの距離を使用するだろう。 4番目のコーナーを見つけるには、見つかった最初の3つのコーナーが形成する三角形の外側に、最も近いコーナーのラインから最も遠いポイントになります。

これは非常に時間のかかる方法ですが、試したことはありませんが、うまくいくはずです。

+0

これは、中心が分かっていることを前提としています。角が定義されていない場合、ポリゴンの幾何中心は依然として変数です。 – Stewbob

+4

私はあなたの中心としてあなたが選択する任意のポイントは、それから遠い点はコーナーになると思います。 – David

+0

「矩形」のすべての点の平均を取って、良い中心点を得ることができます。これは、あなたの長方形のマスクが比較的エラーのないものであることを前提としています。 –

4

多角形のすべての線に対して(したがってy = min(y).. max(y))、l = min(x)とr = max(x)を得るようにしてください。左/右の勾配(deltax)を計算し、それを前の勾配と比較してください。それが変更された場合(ここでいくつかの許容差を使用してください)、あなたは四角形の隅に(またはその近くに)あります。低解像度のために勾配が正確になることはできませんが、大きな矩形と勾配がそれほど似ていない場合は、これはうまくいくはずです。

少なくとも、それはあなたの例に適しています:あなたはすでにコーナーのうちの2つを持っているので、

X0000000000X l = 0, r = 11 
.00000000000 l = 1, r = 11, deltaxl = 1, deltaxr = 0 
..X000000000 l = 2, r = 11, deltaxl = 1, deltaxr = 0 
.....0000000 l = 5, r = 11, deltaxl = 3, deltaxr = 0 
........0000 l = 8, r = 11, deltaxl = 3, deltaxr = 0 
...........X l = 11, r = 11, deltaxl = 3, deltaxr = 0 

あなたは、あなたがLとRのための2つの異なる値を取得する長方形の上部で始まります。左側の最初の3行はdeltax = 1になりますが、その後deltax = 3になるので、(3、3)に角があります。右側では何も変わらず、deltax = 0なので、最後にポイントを得るだけです。

ここでコーナーを「収集」していることに注意してください。最後に4つのコーナーがない場合は、スロープが似ています(または、三角形の画像があります) (より正確な)アルゴリズムを使用するか、エラーを返すだけです。矩形に4つ以上のコーナーや穴のような奇妙なものがある場合も同じです。何らかの画像検出が関係しているようですので、これらのケースが発生する可能性があります。

単純DELTAX =(X - lastx)する場合がある長方形の左側は、この例を参照して、良好に動作しません:時々DELTAXは時々1であり、0

xxxxxx 
xxxxx deltax = 1 dy/dx = 1/1 = 1 
xxxxx deltax = 0 dy/dx = 2/1 = 2 
    xxxx deltax = 1 dy/dx = 3/2 = 1.5 
    xxxx deltax = 0 dy/dx = 4/2 = 2 
    xxx deltax = 1 dy/dx = 5/3 = 1.66 

であるが実際の点から左上/右の点(deltay/deltax)までの線の傾きを使用する方が良いでしょう。それを使用しても、許容範囲を守らなければならないでしょうが、新しい行ごとに値がより正確になります。

3

ハフ変換を使用して、マスクされた画像内の4つの最も顕著な線を見つけることができます。これらの線は四角形の辺になります。 線は、4つのコーナーと2つの遠近法の消失点である最大6つの点で交差します。

これらは区別が容易です:四角形の中の任意の点を選択し、この点から6つの交点のそれぞれまでの線が線と交差するかどうかを確認します。そうでない場合、その交点は角です。

ノイズの多い画像や部分的に遮られた画像であっても、セグメント化が正確でない場合でも効果的です。

en.wikipedia.org/wiki/Hough_transform

Example CImg Code

私はあなたの結果に非常に興味があると思います。私はこのようなことを自分で書くことを考えていました。斜めに撮った紙の写真を修正しました。私は現在、4つのポイントが分かっている場合、その視点を修正する方法を考えるのに苦労している。

p.s.また

Zhengyou張、李偉氏私が解決しようとすると、関連する質問を、求めている

四角形を検出するためのより高度なソリューションのための、「ホワイトボードのスキャンと画像強調」 http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf をチェックしてください透視変換: proportions of a perspective-deformed rectangle

+0

私は後の段階でこれを試してみるつもりだと思っていますが、私は最初に閾値を適用するだけで矩形のシルエットを見つけることができる簡単な場合に集中したいと考えました。イメージをまっすぐにするには、2x2の行列を使って、正確な数学的な用語を知らないような動き(MxV + T; M:行列; V:ベクトル; T:動きベクトル)を使ってみました。この計算では、4点のうち3点しか考慮しませんが、1点が常に消えるためです。私は現在、3x3行列(3D変換)で数学を扱おうとしていますが、まだ完全には機能していません。 – dutchflyboy

関連する問題