Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Köşe koordinatları bilinen bir resmi kırpıp döndürme işlemi

Konu, 'C#' kısmında siirsen tarafından paylaşıldı.

  1. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0
    Aşağıdaki fotoğrafta yer alan resmin "Portable Aforge" ile köşe koordinatlarını buluyorum, resmi, perspektif sorunlarını çözecek şekilde tam bir dikdörtgen içine yerleştiriyorum ama ücretli olduğu için resim kullanılmaz şekilde çarpı işareti ile işaretleniyor. Universal Windows Platform (UWP) projesinde bu işaret var iken normal Windows projesinde bu işaret yok.

    Resmin Aforge ile köşe koordinatlarını buldursam, başka yöntemlerle UWP projesinde perspektif sorunlarını halledecek şekilde kırpma işlemini gerçekleştirmek mümkün mü?
     

    Ekli Dosyalar:

  2. centauru

    centauru Üye

    Kayıt:
    21 Temmuz 2008
    Mesajlar:
    195
    Beğenilen Mesajlar:
    3
    Tam olarak ne yapıcagını anlayamadım .. ama resimin köşe kordinatlarını bulduysan ve bu kordinatların dışını silmek istiyorsan
    Buldugun köşeleri kullanarak yeni poligonlar oluşturarak bu poligonların içini beyaz renkle doldur. ozaman arka plan beyaz fon içinde köşe kordinatlarını bulduğun resim geriye kalır..

    Veya Köşe kordinatlarını bulduğun perspektif duran resmi düz kare veta dikdörgene şekline dönüştüreceksen
    Opengl ,DirectX yada başka bir 3d kutuphane ile dönüştürebilirsin.. (Bu Resime önden Tam Düz bakıyor gibi bir açı oluşturabilir veya 3d olarak resimi istediğin açıda çevirmenide sağlayabilir.)

    Opengl de Bir Plane Oluşturum Texture olarak bu resmi ve Buldugun köşe kordinatlarını girmen yeterli.
     
  3. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0
    Fotoğraftaki resmin köşe koordinatlarını aforge ile buluyorum.
    Fotoğrafta da görüldüğü gibi perspektif bir yamukluk söz konusu.
    Aforge ile bu yamukluğu da giderip tam bir dikdörtgen içine yerleştiriyorum, sanki tam merkezi noktadan fotoğraf çekilmiş gibi bir görüntü elde ediyorum.
    Bilgisayarda aforge kullanmakta bir sorun yok, engel çıkarmıyor; ancak UWP projesi yaparken Aforgeye ait Shim ve Shim.Drawing dll'lerini kullanmak gerekiyor bu da resmin üzerini çiziyor, kullanılmaz kılıyor; para ile satın almadan resmin üzerini çizmeyi bırakmayacağını biliyorum.
    Projeyi telefonda çalışması için hazırlıyorum.

    Çözüm için söylediklerinize gelince her biri de benim için çok yabancı, üstelik dil de yok; herkesin çabucak hallettiğini ben uzatarak çözüyorum/çözemiyorum.
    Daha ayrıntılı ipucu verirseniz ve çok zor da olmayacaksa benim için bakmak isterim.
     
  4. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    675
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    çarpıyı koyan aforge değilde UWP sanmıştım. !!

    microsoftun ücretsiz emguCv si var. C# ile kullanabilirsin.

    Köşe koordinatlarını bulduktan sonra crop işlemini ve save işlemini emguCV ile yapabilirsin.

    Visual studio tools menüde,
    nuget package manager-manage nuget packages
    den emguCV son versiyonunu ara,(sanırım 3.1) install et. Projene gerekli dosyaları ekliyor ve bin klasörüne ilgili dll leri kopyalıyor.

    reference lerede ekliyor ama yok ise emgucv.util de ekli olmalı yoksa resmi kırpacağın cvInvoke tanınmayabiliyor.

    emgucv image crop and save diye google da taratırsan basit örneklerde bulabilirsin.
    köşe rakamlarını Rectangle nesnesine yüklemelisin.

    angle ve rotate metodlarıda var, bilmiyorum perspektif düzeltmeyide bununla yapabilirmisin. Detayı bilmiyorum.
    kolay gelsin.
     
  5. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0
    emguCV 'yi de ücretli biliyordum. Benzer engeli bu da koyar diye düşünmüştüm. Umarım koymaz, bakacağım önerinize. Teşekkürler. Basit şekilde Aforge bu perspektif düzeltmeyi yapıyordu oysa.
     
  6. centauru

    centauru Üye

    Kayıt:
    21 Temmuz 2008
    Mesajlar:
    195
    Beğenilen Mesajlar:
    3
    c# çok iyi bilmiyorum .. opengl kullanmak icin kutuphaneler var..Onlardan bulup ornekleri yukleyip incelemelisin Ben Genelde Delphi Kullanıyorum..
    Çok zor değil OpenGL kullanmak ..
    OpenGL de ise Şu kodlar ile Resmini Kare şeklinde düz bir zemine yerleştiriyorsun (Koddaki Koordinatlar uydurma...)
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

    glTexCoor2f (resmin x Noktası ,resmin y Noktası ) ; glVertex3f(Objenin x noktası , Objenin Y noktası , Objenin Z noktası)
    GlVertex3f bir obje olusturuyor.. burda 4 kez kullanılmıs 4 koseli bir poligon yani.. kare olusturuyor

    Senin resimde de 4 kose noktası bulduguna gore bu noktaları glTexCoord2f yazman lazım

    Koordinatlar 0 ile 1 arasında Float olarak yazılıyor..
    Tabi Tum OpenGL Kodları Bunlar degil..
    OpenGL yi initialise edmeli, Kamera yerleştirmen ve Rotasyonunu ayarlayıp 4 gen objene cevirmen lazım .. Camera ortho moda almalısın.
    Aslında Hepsinin Çok bir kodu yok..

    Bu Resmi duzgun bir kare haline getirir .
    Sonrada Ekran Görüntüsü alıp kaydedersen istediğin şeyi yapmış olursun..


    emguCV Yi bilmiyorum ama 3d Olayı varsa Onlada olur.. 3d hiç kullanmadan da yapılabilinir. ama ImageProcesing ile bir suru hesap algoritma işi .. ugrasman lazım.. Yada Hazır Açık kaynak kütüphane bulman lazım
     
    siirsen bunu beğendi.
  7. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0
    Google'nin saçma sapan bir uygulaması var bu tür bir probleme çözüm oluyor. Eski fotoğrafların resmini çekiyorsun, biraz uğraştırarak kenarlarından kırpıyor. PhotoScan . Bu konuda çalışmak isteyen olursa buyursun. Benim yapmak istediğim de aynı şeye benziyor ama farklı problemlere çözüm olsun istiyorum...
     
  8. centauru

    centauru Üye

    Kayıt:
    21 Temmuz 2008
    Mesajlar:
    195
    Beğenilen Mesajlar:
    3
    Bu Kod internettten indirdiğim bir kod. DGLOpenGL, Ve DGLShader Kutuphanesi ile çalışıyor..
    Ben sadece Koddaki PROCEDURE DrawQuad ( pX, pY, pWidth, pHeight : SINGLE ); kısmıda
    küçük bir değişiklik yapıp senin örneğini ve istediğini yaptırdım. Yani Demek istediğim her hangi bir örnek ders bulursan tum kodu bilme zorunda değilsin .. ilgili yerleri değiştirmen yeterli.
    bu arada butun opngl kodları standarttır.. delphideki GL kodu C# tada aynı.. ama sadece opengl kodları yan gl ile baslayanlar
    delphi kodu
    Kod:
    { sharing sourcecode to Pascal Game Development members by Micronix-TRSI }
    
    USES
      Windows,
      VCL.Graphics,
      Vcl.imaging.JPEG,
      dglOpenGL,
      dglShader;
    
    VAR
      DemoStart, LastTime : DWORD;
      ElapsedTime         : INTEGER;
      glslsimplevert,
      glslsimplefrag      : TGLSLShader;
      glslsimpleprog      : TGLSLProgram;
      pfd                 : TPixelFormatDescriptor;
      DC                  : HDC;
      BackgroundTexture   : glUint;
    
    {$I texture.pas}
    
    PROCEDURE DrawQuad ( pX, pY, pWidth, pHeight : SINGLE );
    BEGIN
    // Acmıs oldugun pencerenin boyutuna gore  Sekil alan bir dörtgen yuzey oluşturup
    // bu yuzeyin ustune senin  köşe kordinatlarını girdiğın resmi yerleştiriyor
    // istediğin işlemi yapan ana kısım burası
    // glTexCord2f ile Köşe kordinatlarını giriyorsun.
    
      glBegin ( GL_QUADS );
        glTexCoord2f ( 0.14, 0.05 ); glVertex2f ( pX - pWidth / 2, pY - pHeight / 2 );
        glTexCoord2f ( 0.95, 0.2 ); glVertex2f ( pX + pWidth / 2, pY - pHeight / 2 );
        glTexCoord2f ( 0.91, 0.91 ); glVertex2f ( pX + pWidth / 2, pY + pHeight / 2 );
        glTexCoord2f ( 0.099, 0.91 ); glVertex2f ( pX - pWidth / 2, pY + pHeight / 2 );
      glEnd
    END;
    
    BEGIN
      InitOpenGL;
      DC := GetDC ( CreateWindowEx ( 0, 'EDIT', NIL, WS_POPUP or WS_VISIBLE OR WS_MAXIMIZE, 0, 0, 640, 480, 0, 0, 0, NIL ) );
      ShowCursor ( FALSE );
      pfd.dwFlags := PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER;
      SetPixelFormat ( DC, ChoosePixelFormat ( DC, @pfd ), @pfd );
      ActivateRenderingContext( DC, wglCreateContext ( DC ), TRUE );
      DemoStart := GetTickCount;
      ElapsedTime:=1;
      //load simple glsl shader
      glslsimpleprog := TGLSLProgram.Create();
      //glslsimplevert := TGLSLShader.Create('RadialBlur.vert');
    // glslsimplefrag := TGLSLShader.Create('RadialBlur.frag', GL_FRAGMENT_SHADER_ARB);
      //glslsimpleprog.Attach(glslsimplevert);
    // glslsimpleprog.Attach(glslsimplefrag);
      //glslsimpleprog.Link;
      //glslsimpleprog.Enable;
      glEnable         ( GL_TEXTURE_2D );
      LoadJPGTexture ( 'DSCF0383e.jpg', BackgroundTexture, GL_NEAREST, GL_NEAREST, GL_TEXTURE_2D );
      glBindTexture    ( GL_TEXTURE_2D, BackgroundTexture );
      glslsimpleprog.Set2F('resolution',640*2,480*2);
      WHILE GetAsyncKeyState ( 27 ) = 0 DO
        BEGIN
          glslsimpleprog.setf('time', elapsedtime/640);
          glLoadIdentity;
          glOrtho          ( 0, 640, 0, 480, 0, 1 );
          DrawQuad         ( 320, 240, 640, 480 );
          LastTime := ElapsedTime;
          { Calculate Elapsed Time }
          ElapsedTime := GetTickCount - DemoStart;
          { average it out for smoother movement }
          ElapsedTime := ( LastTime + ElapsedTime ) DIV 2;
          SwapBuffers      ( DC )
        END
    END.
    
     

    Ekli Dosyalar:

    Son düzenleme: 3 Mart 2017
    siirsen bunu beğendi.
  9. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0
    Öncelikle ilginiz için teşekkür etmek isterim. Ancak böyle demesi kolay benim gibi bir acemiye. Resim enine biraz uzun duruyor, kağıdın gerçek ölçüleri 25X35 .
     
  10. centauru

    centauru Üye

    Kayıt:
    21 Temmuz 2008
    Mesajlar:
    195
    Beğenilen Mesajlar:
    3
    ekranı 640 X 480 ayarlı olduğundan EN/Boy oranı tutmamış. senin 25X35 yani ,35 genişlik 25 uzunluga gore orantılarsak ozaman ekranın 640 X 457 ayarlanması lazım

    WEBGL var.. JavaScript + GL komutları ile calışıyor. WEBGL ilede yapabilirsin Bir Android Uygulamada WEBView kullanarak
    WEB GL yi gösterebilirsin.. Çok az anlıyorum demişsin ama yinede Birşeyler yapıyorsun ,
    uğraş üstünde çözersin ..
     
    Son düzenleme: 4 Mart 2017
    siirsen bunu beğendi.
  11. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0
    Android değil, Windows Phone uygulaması yapmaya çalışıyorum, bilgisayarda da çalışacak şekilde bir uygulama.
    Çözümü aforge ile yapmaya karar verdim ve yaptım. en boy oranı bu şekilde de sorun oluşturuyor ancak kullanıcının resmi direk karşıdan çekeceği varsayılarak küçük perspektif sorunları ortalama bir şekilde doğru ölçülere yakın bir oranla tespit ediliyor. Bu durumda kağıdın uzun ve kısa kenarını birbirine oranlamak veya kullanıcıdan kağıdın ölçülerini belirtmesini istemek gerekmiyor.
    Matematik bilgim olmadığı için çözemiyorum, yukarıda söz ettiğim perspektife uğramış resimde, kağıdın en boy oranını. Aslında fotoğrafın kısa ve uzun kenarı ile resmin kenarları arasındaki mesafeyi ele alarak resmin perspektife uğramadığı düşünülen kenarı ile diğer kenarlarının açı ve uzunluklarından hareket edilerek resmin uzun kenarı ile kısa kenarını oranlamak mümkün olmalı. Ama söylediğim gibi artık uğraştırıcı ve benim için zor olacağı için vazgeçtim; yapabileceklerime odaklanacağım bu noktadan sonra.
    Teşekkürler.
     
  12. siirsen

    siirsen Aktif Üye

    Kayıt:
    13 Ağustos 2008
    Mesajlar:
    361
    Beğenilen Mesajlar:
    0