‘programlama’ etiketli içerik

Giyim mağazalarında çoğu zaman bir ürünü almadan önce denemek isteriz, peki ya denemek mümkün değilse? Seçeneklerin artması ile denemenin daha zahmetli hale gelmesi bir yana online alışveriş gibi durumlarda denemek hiç mümkün olmayabilir. Bu yazıda geçenlerde geliştirdiğim bir uygulama olan sanal giyinme odasından bahsedeceğim. Uygulamada kullanıcı sanal bir ortamda giysi seçebilmekte ve seçtiği giysileri üzerinde deneyebilmektedir.

Uygulamayı geliştirirken bir görüntü ve derinlik sensörü olan Microsoft Kinect’i ve Microsoft Research tarafından geliştirilen yazılım geliştirme kitini (Kinect SDK) kullandım, uygulamanın çalışma mantığını genel olarak aşağıdaki gibi özetleyebilirim:

  • Derinlik ve kullanıcı etiketi verisinden faydalanılarak kullanıcının canlı video akışından çıkarılması (arkaplan silme),
  • İstenmeyen örtüşmelerin engellenmesi için ten rengi algılama,
  • Giysi modelinin konum ve rotasyonunun eklem noktalarının koordinatlarına göre hizalanması,
  • Giysinin eklemler arası uzaklık ve kameradan uzaklık verisinin kullanılarak ölçeklenmesi,
  • Modelin kullanıcının üzerinde gösterilmesi.

Ön işlemler: arkaplan silme ve ten rengi algılama

Arkaplan silme bu uygulamada iki açıdan kolaylık sağlamaktadır. Birincisi kullanıcıyı çıkartarak ileriki işlemler için ilgili olan alanı (ROI) belirlememizi sağlamaktadır. Bu sayede ten rengi algılama aşamasında arkaplandaki ten rengine benzer alanların da ten rengi olarak algılanması problemi çözülmüş olmaktadır. İkincisi ise arkaplanı sildiğimizde herhangi istediğimiz bir arkaplanla değiştirerek sanal bir ortam oluşturabiliriz. KinectSDK’nın sağlamış olduğu derinlik ve kullanıcı etiketi verisini kullanarak basit bir maskeleme ile bu işlemi kolayca gerçekleştirebiliriz.

Giysi modeli görüntünün üstüne eklendiğinden kullanıcının hareketi modelin arkasında kısıtlı kalmaktadır. Bu bağlamda ten rengi algılamada istenmeyen örtüşmelerin engellenmesi amaçlanmıştır.  Uygulamada ten rengine sahip alanlar en üst katmana taşınarak model ile örtüşmeleri engellenmektedir. Bu konuda yapılabilecek daha akıllıca bir çözüm derinlik verisinden faydalanarak giysi modeli ile kullanıcının derinlik sıralamasını ayarlamak olabilir. Burada böyle bir yaklaşımı benimsememin tek nedeni daha kolay olmasıydı. Kameradan gelen RGB görüntü YCbCr renk uzayına dönüştürülüp her renk kanalı için basit bir eşikleme uygulanması ten rengi algılamada en basit çözüm olarak kolayca gerçeklenebilir.

Hizalama ve ölçekleme

Kinect SDK ile sağlanan iskeletsel takipçi (skeletal tracker) vücut eklemlerinin 3 boyutlu koordinatlarını yaklaşık olarak vermektedir. Eklemlerin ekrandaki piksel konumları ve birbirleri ile yaptıkları açılardan faydalanılarak giysi modelinin konumlandırılması ve döndürülmesi sağlanmıştır. Omuzlar arası uzaklık, boy uzunluğu ve kullanıcının kameradan uzaklığı değerlendirilerek giysi modeli ölçeklenmiştir.

Daha neler yapılabilir?

Başarım kriterini kullanıcının giysi modeli ile örtüşme oranı olarak belirleyerek uygulamayı farklı koşullar altında test ettiğimizde %83 ortalama başarı oranı elde ettik. İlerleyen aşamalarda 3 boyutlu giysi modelleri ve fizik motoru kullanılarak daha gerçekçi sonuçlar elde edilebilir. Alternatif olarak giysilerin farklı açılardan çekilmiş fotoğrafları kullanılarak sahte 3d izlenimi oluşturulabilir. Örtüşmelerin işlenmesinde daha önce de bahsettiğim gibi renk özellikleri yerine derinlik verisinden faydalanılabilir.

Gelen geribildirimler üzerine şunu da belirtmek istiyorum evet daha önce yapılmış benzer uygulamalar var, zaten bu fikri ilk benim bulduğum gibi bir iddiada bulunmuyorum. Benimkisi ticari olmayan yalnızca deneysel amaçlı bir çalışma.

Daha detaylı bilgi için:
A more detailed report (in English): A Real Time Virtual Dressing Room Application using Kinect ]

Bugün neredeyse bütün kamera ve görüntü işleme yazılımlarının sahip olduğu görüntü birleştirme (panoramik çekim) özelliğinin nasıl çalıştığını merak ettiniz mi? Bu yazıda en basit anlamda görüntü birleştirmenin nasıl yapılabileceğine değineceğim, kaynak kodları ve daha detaylı raporu yazının ekinde bulabilirsiniz.

Birleştirilecek görüntüler farklı perspektiflerden çekilmiş olduğundan doğrudan görüntüleri uç uca ekleyerek güzel sonuçlar almamız pek mümkün değil. Bu yüzden ilk olarak görüntülerin perspektiflerini birbirine göre hizalamamız gerekiyor. Neyi neye göre hizalamamız gerektiğini bulmak için öncelikle ardışık iki görüntünün kesiştiği alandaki bazı ortak noktaları buluyoruz.

1. Ortak Noktaların Bulunması

Ortak noktaları SIFT veya SURF gibi çeşitli anahtar nokta tanımlayıcı algoritmalar yardımı ile otomatik olarak bulabiliriz ancak bu örnekte karmaşıklığı artırmamak için noktaları el ile işaretliyoruz. Örneğin iki görüntüde de yer alan binaların köşe noktalarını işaretleyebiliriz.

2. Görüntülerin Hizalanması

İlk görüntüde bulduğumuz ortak noktalardan oluşan matrise X, bu noktalara karşılık gelen ikinci görüntüdeki noktaların koordinatlarından oluşan matrise x diyecek olursak bu noktaları arasında eşleşme yapmamıza olanak sağlayacak “X = Hx” eşitliğini sağlayan bir dönüşüm matrisi (H) bulmamız gerekir (daha detaylı matematiksel açıklama için ekteki rapora bakabilirsiniz).

Dönüşüm matrisini bulduktan sonra ilk görüntüdeki bütün noktaların koordinatlarına bu dönüşümü uygulayarak hizalamadan sonra olması gereken koordinatlarını bulabiliriz. Bu şekilde bir dönüşüm uygulandığında bir bakıma noktalara birebir eşleme yapmış oluyoruz. Bu durumda görüntüdeki toplam nokta sayısı değişmemiş oluyor ve küçük bir görüntüden daha büyük bir görüntüye eşleme yaptığımızda elde edilen piksellerde boşluklar bulunması muhtemel olacaktır. Bu sebeple kaynak görüntüdeki her nokta için yeni değer hesaplamak yerine hedef görüntüdeki her noktanın olması gereken değerini interpolasyon ile hesaplamak (inverse mapping) daha mantıklı olacaktır.

3. Görüntülerin Birleştirilmesi

Görüntüler hizalandıktan sonra birleştirme aşamasında kesişen bölgelerde basitçe iki görüntünün ortalaması alınabilir veya yakın olan görüntünün ağırlığı daha yüksek olacak şekilde ağırlıklı ortalama alınabilir. Bu örnekte daha basit olması için kesişen bölgelerde en parlak pikselin değeri alınmıştır.

Daha detaylı bilgi ve MATLAB kodları için:
More detailed report (in English) and the source code: [Image Stitching /Mosaicing by Furkan Isikdogan]

İçerik tabanlı görüntü erişim teknikleri, genellikle geniş görüntü veritabanlarında istenilen özelliklerde sayısal görüntü aramakta kullanılmaktadır. Görüntü erişiminde renk, doku, şekil vb. özelliklerden faydalanılabilmektedir. İçerik tabanlı görüntü erişiminin basit bir uygulaması olan ‘GörüntüBul’ ile seçilen bir görüntünün renk özelliklerine bakılarak benzer görüntüler belirtilen dizinler altında aranabilmektedir.

Yapılan her aramada, belirtilen dizin altındaki bütün görüntülerin tekrar tekrar işlenmemesi için, seçilen her dizin için bir kez olmak üzere ‘Sistemi Eğit’ sekmesi altında özellik dosyası oluşturulması gerekmektedir. Daha sonra bu dosya kullanılarak ‘Sistemi Sına’ sekmesinden istenilen görüntü ile arama yapılabilmektedir.

Görüntü arşivi içerisinde, seçilen bir görüntüye benzer görüntüleri bulmakta kullanılabilecek bu uygulamayı aşağıdaki linkten ücretsiz indirebilirsiniz:

[GörüntüBul v0.1] (0,8 MB)

Uygulamanın temel çalışma mantığını ve kaynak kodlarını yazının devamında inceleyebilirsiniz.

Devamını Oku »

8-Puzzle problemi 1’den 8’e kadar sayılarla doldurulmuş ve bir karesi boş olan 3×3 boyutunda bir matrisin istenilen bir hedef duruma getirilmesinin amaçlandığı bir oyun olarak tanımlanabilir. Puzzle üzerindeki elemanların yalnızca boşluk ile yer değiştirdiği (kaydırıldığı) hareketler geçerli kabul edilmektedir.

Çözüm uzayında herhangi bir durumdan en fazla 4 duruma geçilebilmektedir. Çözüm uzayının ağaç yapısıyla ifade edilmesi mümkündür, ancak bu uygulamada sezgisel arama sırasında en küçük durumun bulunmasını kolaylaştırdığı için kuyruk yapısının kullanılması tercih edilmiştir. Bu çalışmada sezgisel arama yöntemi olarak A* algoritması ve sezgisel olmayan arama yöntemleri olarak önce enine arama ve önce derinliğine arama algoritmaları gerçeklenmiştir.

Geliştirilen uygulamayı aşağıdaki linkten indirebilir, çözüm detaylarını yazının devamında okuyabilirsiniz.

[8-Puzzle Çözücü v1.1] (0,4 MB)

Devamını Oku »

Videolardan alınan örneklerden oluşan görüntü dizilerinin birleştirilerek özet kare elde edilmesi basit bir işlem olmakla birlikte çeşitli ileri uygulamaların temeli olabilir. Fizikte bir eylemin özetlenmesi, örneğin belirli açılarla fırlatılan bir topun bu eğik atış hareketindeki yörüngesinin gözlenmesi görüntü dizisi birleştirme ile sağlanabilir. Daha sonraki aşamalarda görüntü dizilerinden hareket vektörleri çıkarılarak trafik yönünün ve akış hızının belirlenmesi gibi benzer uygulamalar yapılabilir. Ancak bu gibi uygulamalar bu çalışmanın kapsamında incelenmemiştir.

Bu çalışmada örnek sayısı arttıkça hareketlinin belirginliğinin azalması başlıca sorunlardan biri olmaktadır. Yaptığımız işlem içerik duyarlı olmayıp basit bir ortalama alma işlemi olduğundan böyle bir sonuç alınmıştır. Gelişen görüntü işleme teknikleri artık içerik duyarlı işlemlere olanak sağlamaktadır. Eğer hareketli nesneyi arka plandan ayırıp, birleştirme sırasında da hareketliye daha yüksek bir katsayı, arka plana daha düşük bir katsayı verebilirsek hareketlinin belirginleşmesini sağlayabiliriz.

Devamını Oku »

Kodlamasını az önce tamamladığım basit bir oyun “Adam Kurtarmaca”. Adam asmaca oyununa iyimser bir bakış açısı… Artık kendimizi kötü hissetmeden, vicdan azabı çekmeden adam asmaca oynayabileceğiz. :) Aslında oynanış olarak adam asmacadan pek farkı yok. Tek fark adam asmacada oyuncu katil,zalim,acımasız bir karakteri oynarken, adam kurtarmacada masumu kurtaran iyi adam rolünde oynuyor. :)

Kaynak Kodlar:

Devamını Oku »

Okul kantinlerinin işine yarayabilecek basit bir yazılımcık. Programın ilk hali CSE200 dersi ödeviydi, yazdığım program boşa gitmesin diye bir kaç yeni özellik ekledim ve program yazılımcıklarım arasında yerini aldı.

  • İşte programın özellikleri:
  • Hesapları rasgele erişimli dosyada saklama
  • Hesap ekleme – Hesap silme
  • Kredi yükleme – Alışveriş (Kredi Silme)
  • Hesap arama – Hesap bilgilerini görüntüleme

Kaynak Kodlar:

Devamını Oku »

‘Yazılımcıklar’ olarak nitelediğim basit çalışmalarımdan biri olan Öğrenci Otomasyonu’nun özelliklerinden bazıları:

  • Öğrenci verilerini txt uzantılı dosyada saklayabilme
  • Txt dosyasından hazır öğrenci listesi yükleyebilme
  • Not ortalamasına göre sıralama, basit istatistikler
  • Final ve vize puanına göre sıralama
  • En yüksek final ve vize notlarını alan öğrencileri görüntüleme
  • Geçme-kalma durumu, geçen ve kalan öğrenci sayıları

Kaynak Kodlar:

Devamını Oku »

Arşivler
Meta