2009-06-25 14 views
7

Dikdörtgenin perspektifini otomatik olarak düzelten bir program yapmaya çalışıyorum. Dikdörtgenin silüetini elde etmeyi başardım ve perspektifi düzeltmek için gereken kodu aldım, ancak köşeleri bulamıyorum.Deforme olmuş bir dikdörtgenin köşelerini bulun

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

Bu, bu durumla işe yaramaz (X bir köşeyi gösterir):

X0000000000X 
.00000000000 
..X000000000 
.....0000000 
........0000 
...........X 
en büyük sorun o deforme edildiği için, aşağıdaki "kod" kullanamazsınız, yani

Bunu nasıl yapacağını bilen var mı?

+0

Niçin çalışıyorsunuz? Gerçek maksimumu ve gerçek minayı bulmanız gerekecek (hangisinin gerçekten maksimum ve min olduğunu belirlemeye karar vermeden önce sahip olduğunuz tüm noktaları inceleyerek) ama bir noktada size söylenecek bazı verilere güvenmek zorunda kalacaksınız. dikdörtgen _should_ gibi görünüyor. –

+0

Köşeler için nokta koordinatları olmadan dikdörtgenin silüetini nasıl elde ettiniz? – Stewbob

+0

Giriş olarak bir resimim var, eşik fonksiyonuyla ilginç kısmı arka plandan ayırabilirim. – dutchflyboy

cevap

5

Merkezden en uzak nokta size bir köşe verecektir. İlk köşeden en uzak nokta, size bitişik veya karşıt olan bir başka köşe sağlar. Bu iki köşe arasındaki çizgiden en uzak nokta (biraz daha matematiksel) üçüncü bir köşeyi size verecektir. Merkezden mesafeyi bir kravat kırıcı olarak kullanırdım. 4. köşeyi bulmak için, bulduğunuz üç köşenin oluşturduğu üçgenin dışında, bu köşeler arasındaki en yakın çizgiden en uzak nokta olacaktır.

Bunu yapmak çok zaman alıcı bir yoldur ve hiç denemedim, ama işe yaramalı.

+0

Bu, merkezin bilindiğini varsayar. Köşeler undefined ise, o zaman poligonun geometrik merkezi hala bir değişkendir. – Stewbob

+4

Sanırım merkeziniz olarak seçtiğiniz herhangi bir nokta, en uzak noktası bir köşe olacak. – David

+0

İyi bir merkez noktası elde etmek için tüm 'dikdörtgen' puanlarınızı her zaman ortalayabilirsiniz. Bu, dikdörtgen maskenizin göreceli olarak hatasız olduğunu varsayar. –

4

Bir tarama çizgisi algoritması kullanmayı deneyebilirsiniz - Çokgenin her satırı için (yani y = dak (y) .. maks (y)), l = min (x) ve r = max (x) olsun. Sol/sağ eğimi (deltax) hesaplayın ve daha önce çizgiyle eğim ile karşılaştırın. Eğer değiştiyse (burada biraz tolerans kullanın), dikdörtgenin bir köşesindesiniz (ya da yakınına). Eğim, düşük çözünürlük nedeniyle tam olarak olamayacağından, ancak büyük dikdörtgenler ve eğimler için çok benzer olmadığından, bu durum işe yaramaz.

En azından, bu örneğin iyi çalışır: Zaten köşelerinde iki tane yüzden

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 

Sen, l ve r için iki farklı değerler elde dikdörtgenin üst başlar. Sol tarafta, ilk üç satır için deltax = 1 olacaksınız, ancak ondan sonra deltax = 3 olacak, yani bir köşe var (3, 3). Sağ tarafta hiçbir şey değişmez, deltax = 0, böylece sadece son noktayı alırsınız.

Burada köşeleri "topladığınızı" unutmayın, bu nedenle sonda 4 köşeniz yoksa, yamaçlar çok benzer (veya bir üçgenin resminiz var) ve farklı bir alana geçebilirsiniz. (daha kesin) algoritma veya sadece bir hata verin. Dikdörtgende 4 köşeden daha fazla veya deliğe benzer başka garip şeyler varsa. Bir çeşit görüntü tespitinin söz konusu olduğu görülüyor, bu yüzden bu durumlar ortaya çıkabilir, değil mi? bazen 1'dir,

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 

Bazen DELTAX 0'dır: - (lastx x) iyi çalışmaz, bir dikdörtgenin sol tarafı için bu örneğe bakın

basit DELTAX = ettiği durumlar vardır Çizginin eğimini asıl noktadan sol/sağ noktaya (deltay/deltax) kullanmak daha iyidir. Bunu kullanarak, hala bir toleransla uğraşmak zorunda kalacaksınız, ancak değerleriniz her yeni satırda daha kesin olacaktır.

3

Maskelenmiş görüntüdeki en önemli 4 çizgiyi bulmak için bir hough dönüşümü kullanabilirsiniz. Bu çizgiler dörtgenin kenarları olacak. Çizgiler, 4 köşeli ve 2 perspektif kaybolan nokta olan 6 noktaya kadar kesişecektir.

Bunların ayırt edilmesi kolaydır: dörtgen içinde herhangi bir noktayı seçin ve bu noktadaki çizginin 6 kesişme noktalarının her birine çizgilerin herhangi biriyle kesişip kesişmediğini kontrol edin. Eğer değilse, o zaman kesişme noktası bir köşedir.

Bu, gürültülü veya kısmen engellenmiş görüntüler için bile iyi çalışabileceği veya bölümleme kesin olmadığında avantajlıdır.

en.wikipedia.org/wiki/Hough_transform

Example CImg Code

senin sonuçlarında çok ilgi olacaktır. Böyle bir şey yazmayı düşünüyorum, bir açıyla çekilen kağıt sayfalarının fotoğraflarını düzeltmek için. Şu anda 4 puan

p.s. olarak biliniyorsa, perspektifi düzeltmek için bir yol düşünmeye çalışıyorum. Ayrıca

Zhengyou Zhang Li-Wei He ben çözmeye çalışır ilgili soru sormuştu,

dörtgen tespiti için daha gelişmiş bir çözüm için, "Beyaz Tahta tarama ve görüntü geliştirme" http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf kontrol perspektif dönüşümü: proportions of a perspective-deformed rectangle

+0

Sanırım bunu daha sonraki bir aşamada kullanmayı deneyeceğim, ancak önce basitçe bir eşiği uygulayarak dikdörtgenin silüetini bulabileceğiniz oldukça basit bir duruma odaklanacağımı düşündüm, bu kodu basitleştirir. Görüntüyü düzeltmek için, bir hareket ile 2x2 matris kullanmayı denedim (tam olarak matematik terimini bilmiyorum) (MxV + T; M: Matrix; V: Vector; T: Hareketi vektörü). Bu hesaplama, ancak 4 puanın 3'ünü hesaba katar, çünkü bir nokta her zaman kaybolacaktır. Şimdi, 3x3 Matrix (bir 3D dönüşüm) ile çalışarak matematiği elde etmeye çalışıyorum, ama henüz tam olarak çalışmıyor. – dutchflyboy

İlgili konular