7.5.05

SİU kurultay bildirisi (release)

geçenlerde SİU-2005 için hazırladığımız bildiriyi sunmuştum. bildirimiz kabul edilmiş. basıma hazırlanmış son versiyonunu paylaşacağım. basıma hazır versiyon:
  • Bakış Açısından Bağımsız Gürbüz Plaka Tanıma Sistemi
    View Independent Robust License Plate Recognition System (pdf)

21.3.05

OpenCV ile görüntü işlemeye giriş

bir önceki yazımda, OpenCV'nin Visual Studio 6.0 ile birlikte nasıl kullanılacağından bahsetmiştim. bu yazıda, yeni başlayanlar için OpenCV kullanarak nasıl kod yazılacağına dair bir örnek vereceğim.

yazdığım kod 4 adet işlemi gerçeklemektedir:
  1. Threshold I
    threshold: Türkçesi eşikleme. genellikle görüntü işlemedeki karşılığı, resmin belirli bir değerden(threshold value/eşik değeri) daha küçük değere sahip pixellerin siyaha, daha büyük değere sahip pixel değerleri beyaza boyanmasıdır.
    resmin sol üst köşesinden başlayıp, pixel pixel taranır. pixelin değeri eşik değerimizden küçükse 0, değilse 255 yapılır. ilgili kod:
    for(i=0;i<src->height;i++){
    for(j=0;j<src->width;j++){
    src_pixel_ptr = CV_MOVE_TO(pos_src,i,j,1);
    dst_pixel_ptr = CV_MOVE_TO(pos_dst,i,j,1);
    src_pixel_ptr[0]<thresh_val?
    dst_pixel_ptr[0]=0:dst_pixel_ptr[0]=255;
    }
    }

  2. Threshold II
    OpenCV'nin threshold fonksiyonu kullanarak gerçekleştirilen thresholding işlemi. kod:
    cvThreshold( src, dst, thresh_val, 255, CV_THRESH_BINARY);

    ne kadar da basit değil mi?
  3. Sharpen Filter
    3x3'lük bir sharpen kernelinin uygulanması işlemi. uygulanan kernel:
     0 -1  0
    -1 5 -1
    0 -1 0

    kod:
    // kernel icin gerekli alani ayir
    kernel = cvCreateMat(9,9,CV_32FC1);
    //kerneli in$a et
    cvSet2D( kernel, 0, 0, cvRealScalar(0) );
    cvSet2D( kernel, 0, 1, cvRealScalar(-1) );
    cvSet2D( kernel, 0, 2, cvRealScalar(0) );
    cvSet2D( kernel, 1, 0, cvRealScalar(-1) );
    cvSet2D( kernel, 1, 1, cvRealScalar(5) );
    cvSet2D( kernel, 1, 2, cvRealScalar(-1) );
    cvSet2D( kernel, 2, 0, cvRealScalar(0) );
    cvSet2D( kernel, 2, 1, cvRealScalar(-1) );
    cvSet2D( kernel, 2, 2, cvRealScalar(0) );
    // filtreyi/kerneli uygula
    cvFilter2D( src, dst, kernel, cvPoint(-1,-1) );

  4. 5x5 Median Filter
    Median Filter şu biçimde çalışır:
    1. nxn'lik bir pencere oluştur ve sol üst köşeden başla
    2. pencerenin içinde kalan değerleri sırala.
    3. pencerenin tam ortasındaki pixel'in değerine, sıralanmış değerlerin ortadakini ata.
    4. resimin sonuna gelinmemişse pencereyi kaydır ve 2'ye git.
    5. dur
    nxn boyutundaki pencerenin tam ortasındaki değerden bahsedebilmemiz için, n tek olmalıdır. kod:
    cvSmooth( src, dst, CV_MEDIAN, 5, 0, 0 );
gerekli dosyalar:
  • opencv_1.cpp - yukarıda bahsedilen işlemlerin gerçeklendiği C++ dosyası.
  • Lena'nın resmi ;)
    Lena, görüntü işlemede giriş resmi için yaygın olarak kullanılan bir bayandır. ilk olarak 1973'de kullanılmıştır. ünlü fotoğraf Playboy'un Kasım 1972'de yayınladığı dergiden alınmıştır. daha fazla bilgi için buraya.
    normal resim:


    gürültü eklenmiş resim:


19.3.05

Visual C++ 6.0 ile OpenCV kullanımı

OpenCV, görüntü işleme(aka. image processing) için Intel'in geliştirdiği bir kitaplık. Sonradan bunu kamusal alana(public) hibe ediyor; OpenCV, an itibariyle sourceforge'da geliştirilmekte.
Visual C++ ile birlikte OpenCV kullanmak yeni başlayanlar için gayet sancılı bir süreç olabiliyor. Sorunuz olursa çekinmeden sorun, ama tabi ki ilk önce RTFM!!
Bir adet de ayarları yapılmış, taslak workspace hediyesi.
Tüm bu işlere başlamadan önce tabi ki OpenCV'yi edinmek gerekiyor. gerekli dosyaları buradan edinebilirsiniz.

Visual C++ 6.0'ı açtıktan sonra File->New... diyerek yeni bir proje yaratalım.


Karşımıza gelen ekranda, Win32 Console Application seçilir; proje ismi de doldurulduktan sonra, bir sonraki adımda An empty project seçilir.


Workspace'imiz hazır. Şimdi sıra, OpenCV kitaplığının kullanılması için yapılması gereken ayarlara geldi.

Menüden Project->Settings... seçilir. Bu ekranda ayarları yaparken Settings for: All configurations'ın seçili olduğundan emin olun.
  1. C/C++sekmesi seçilir.
    Category->Preprocessor
    seçilir.
    Additional Include Directories şu şekilde ayarlanır:
    C:\Program Files\OpenCV\cv\include,C:\Program Files\OpenCV\cvaux\include,C:\Program Files\OpenCV\cxcore\include,C:\Program Files\OpenCV\otherlibs\highgui



    "C:\Program Files\OpenCV\" dizininin OpenCV'yi kurduğunuz dizin olduğunu söylememe gerek yok sanırım. (söyledim bile)

  2. Link sekmesi seçilir.
    Category->General seçilir.
    Object/library modules bölümüne şunlar eklenir:
    cv.lib highgui.lib cxcore.lib

    Category->Input seçilir.
    Object/library modules bölümüne şunlar eklenir(eklenmediyse):
    cv.lib highgui.lib cxcore.lib
    Additional library path bölümüne şu eklenir:
    C:\Program Files\OpenCV\lib




  3. Son olarak, File->New... seçip, Files sekmesinden yeni bir C++ Source File yaratılır. Bu sizin ana dosyanız olcak.



    yeni oluşturduğumuz dosyaya da OpenCV kitaplığını kullanmak için gerekli header dosyalarını yazmamız lazım:
    #include <cv.h>
    #include <highgui.h>
Viola! İşimiz bitti. artık görüntü işlemeye hazırız.

14.3.05

Bilgisayar Mimarisi - Ödev 1

uzun bir aradan sonra yeni dönemin açılıp, temponun artmasıyla beraber yeni şeyleri koymaya başlıyorum. bunlardan ilki Bilgisayar Mimarisi(aka. Computer System Architecture) ödevi.

tanım:
İçinde 8bitlik işaretsiz sayılar bulunan bir dizi bellekte DIZI adresinden başlayarak yer almaktadır. Dizinin eleman sayısı BOYUT simgeli bellek gözünde yer almaktadır ve eleman sayısı için 16 bitlik yer ayrılmıştır. Bu dizideki verileri önce tek sayılar ardından çift sayılar gelecek şekilde yeniden düzenlemek üzere 68000 simgesel dilinde bir program yazılacaktır. Program bellekte hiçir geçici alan kullanmayacak ve 68000?in en fazla 3 saklayıcısından yaralanacaktır. Tanıtılan programı en az sayıda komutla ve 68000?in adresleme kiplerini en etkin şekilde kullanarak yazınız.

örnek: Sırasıyla 1,12,65,43,59,78,98,34,55,13,23,44,56,67 sayılarından oluşan dizi yukarda istenilen program çalıştıktan sonra 1,67,65,43,59,23,13,55,34,98,78,44,56,12 şeklinde olacaktır.

uyarılar
  1. Tek sayıların ve çift sayıların kendi aralarındaki sıralamaları önemli değildir.
  2. Program DIZI adresinden başlayan ve başlangıçtaki dizinin bulunduğu bellek alanı hariç hiçbir bellek alanını kullanmayacaktır.
ödev doyası:
  • mimari_odev_1.x68 - ödevin gerçeklendiği x68 dosyası. verilen örnek için çalışma süresi 684 saat çevrimidir. Daha verimli bir versiyon ile karşılaşırsam buraya koymaya çalışırım.
motorola 68000 işlemcisi için kullanabileceğiniz bir simülatör programı: EASy68K

3.3.05

okulun sunucuları problemi

burada kullanımınıza açılmış dosyalar, üniversitemin sunucularında yer almaktadır. okulumun sunucuları da sanırım zaman zaman sorun yaşıyor, bu yüzden bazen dosyalara erişemeyebilirsiniz. olası bir sorun için şimdiden kusura bakmayın.

okulun sunucularının çalışır vaziyette olup olmadığını anlamanın kolay bir yolu var. yanda bir yerde profilimle ilgili bir kısım var; orada profil resmim görünüyorsa çalışıyor demektir, değilse dosyalara erişemezsiniz.

(:

18.1.05

SİU Kurultayı bildirisi

IEEE 13. Sinyal İşleme ve İletişim Uygulamaları Kurultayı (SİU-2005) için hazırladığımız bildiri:
  • Bakış Açısından Bağımsız Gürbüz Plaka Tanıma Sistemi
    View Independent Robust License Plate Recognition System (pdf)
Bu bildiride uğraştığımız Plaka Tanıma Sistemi(PTS)'nin nasıl çalıştığı az buçuk anlatılıyor. Merak edenleriniz için...

not: bissürü terimin türkçe karşılığını kullanmak zorundaydık, hatırladıklarımdan birkaçını yazayım buraya
  • gürbüz: robust
  • vektör nicemlemesi: vector quantization
  • OKTS: OCR
  • bölütleme: segmentation
  • ikili ayrışma ağacı: binary spliting tree
  • örüntü: texture
  • ilgin dönüşüm: affine transformation
  • benek: pixel (gürbüz benek!?)
  • imge bölgesi: blob

hayırlı bayramlar d:o)

11.1.05

Discrete Event Simulation - Ödev 2

bu ödevde basit bi manufacturing system, GPSS kullanılarak simüle edilecekti. ödev çok basit. eğer az çok GPSS biliyorsanız kolay gelecektir. daha fazla açıklama ihtiyacı duymuyorum.
Ödevin tanımı.
Ödev dosyaları:
esen kalın.

6.1.05

Systems Programming - Ödev 2

Bu ödevde Linux için device driver yazdık. yazdığımız device'ın hardware ile bir işlişkisi yok /dev/null gibi bi device. Bu ödevi son dakikada yaptım, o yüzden rapor falan uğraşamadım, ufacık bi README dosyası var ama zaten dosyaların ne işe yaradığını yazıyor orada da. Ama device çalışıyor, test ettim.
Ödevin tanımı.
Ödev dosyaları:
  • statistics.h - statistics device'ını yazarken kullanacağımız başlık dosyası.
  • main.c - statistics device'ın genel implemantasyonu(hele hele).
  • test.c - device çalışıyor mu test etmek için yaptığım yardımcı bi dosya.
  • yap - modülü derlemek için basit bi script.
  • stat_load - device ile ilgili ayarlamaları(modülün yüklenmesi, /dev/statistics'in yaratılması) yapan script.
  • README - burada yazanların yaklaşık aynısını içeren dosya.
Yanlız bu device driver 2.4.x sürüm kerneller için hazırlandı. yani 2.6.x'de derlemek, yüklemek için kasarsınız, ben de uğraşmadım zaten onun için.
Bi de aygıtın genel yapısına ilişkin şöyle bi resim var:

30 puanlık bonus kısmı tabi ki yapmadım.

5.1.05

Systems Programming - Ödev 1

Bu ödevde random number generator gerçekledik. Bunu yaparken C içinden assembler çağrısı falan yaptık.
Ödevin tanımı.
Ödev dosyaları:
  • LCG.asm - combinedLCG() ve initLCG() fonksiyonlarını gerçekleyen assembler dosyası.
  • lcgmain.c - LCG.asm'nin örnek kullanımı.
  • Rapor - Yapılan işlerin ayrıntılı açıklaması.
Bu ödevden 88 almıştım. En yüksek not da 90 idi(1 kişi). O yüzden bunu bayaa bi geçerli sayabilirsiniz. çalışıyo bayaa. takılan şeyleri sorun dediğim gibi. sayfanın bi yerlerinde mail adresim var (sağa bi bakın).

yazmak bunu gerçekten keyifliydi. hele bi gdb ile debug ederken sadece konsoldan böyle yazılar felan, insan kendini bi bok zannediyo.

Software Engineering

Software Engineering bölümün en sinir bozucu derslerinden birisi. Endüstri mühendisliği gibi organizasyona yönelik bir ders. Kuşkusuz büyük projeler çıkarmanın başka yolu yok gibi ama yine de eğitim böyle olmamalıydı dedirtiyor insana.
Paso atıyosunuz. Şu şöyle olacak, bu böyle olacak diye.
Biz grup olarak Rubik Cube oyananabilecek bi oyun yaptık(?!). Ufacık oyun için de hayvan gibi dökümantasyon çıkarttık. Dökümanlara güvenebilirsiniz kolpa gibi görünse de yüksek notlar aldırdı bize:
  • Report 1: Software Project Plan (doc)
  • Report 2: Software Requirements Specification (pdf)
  • Report 3: Software Design Specification (doc)
  • Report 4: Software Test Plan (pdf)
Burada yayınladığım raporlar İTÜ için örnek teşkil etmektedir. Yoksa hiç bi işe yaramayan şeylerdir. Zerre zevk almadan sırf dersi geçelim diye yaptık.
Bi de sunum var. Böyle matah bişeymiş gibi anlatmak için yaptığımız işi:
Merak edenleriniz için sxi Open Office formatıdır.

Buradan grup arkadaşlarıma da selam ederim, harcadıkları emekler için çokça teşekkürler.
onlar da mutlu olsun :)