ismailari.com

İsmail Arı'nın anasayfası

Temmuz 2010 için arşiv

OpenCV ile PCA (Temel Bileşenler Analizi)

Yorum yapılmadı

Bu yazı temel bileşenler analizinin OpenCV/C++ ile kodlanması üzerinedir. Temel bileşenler analizi hakkında detaylı teorik bilgi için tıklayınız.

Son zamanlarda en çok kullandığım yöntem Temel Bileşenler Analizi olabilir! MATLAB ve Python ile yapılan kodlamaları paylaşmıştım. Bugün C++ ile yazmam gerekiyordu. OpenCV'nin içinde olduğunu öğrenince ve kolaylıkla kullanıverince çok iyi oldu. Buradaki dokümantasyon bölümünde anlatılmış. Henüz Python'a port etmemişler, yeni OpenCV'nin C++ kısmında mevcut. Dokümantasyondaki örnek kod gayet anlaşılır:

PCA compressPCA(const Mat& pcaset, int maxComponents,
                const Mat& testset, Mat& compressed)
{
    PCA pca(pcaset, // veri
            Mat(), // önceden hesaplanmış bir ortalama vektörümüz yok,
                   // o halde PCA sınıfımız onu hesaplasın
            CV_PCA_DATA_AS_ROW, // vektörlerin matrisin satırlarında olduğunu bildir
                                // (sütunlarda olursa CV_PCA_DATA_AS_COL kullanın
            maxComponents // en çok kaç tane temel bileşen olduğunu ver
            );
    // eğer test verisi yoksa, hesaplanan baz vektörleri kullanım için döndür
    if( !testset.data )
        return pca;
    CV_Assert( testset.cols == pcaset.cols );

    compressed.create(testset.rows, maxComponents, testset.type());

    Mat reconstructed;
    for( int i = 0; i < testset.rows; i++ )
    {
        Mat vec = testset.row(i), coeffs = compressed.row(i);
        // vektörü sıkıştır. Sonuç çıktı matrisinin i. satırına yazılacak
        pca.project(vec, coeffs);
        // ve sonra geri oluştur
        pca.backProject(coeffs, reconstructed);
    }
    return pca;
}

PCA ile ilgili teorik bilgi için Google'a başvurabilirsiniz. Jonathon Shlens'in anlatımı çok güzel. Yayın hakkım olmadığı için burada paylaşamıyorum.

30 Temmuz 2010, Kategori: Programlama, Etiketler: , ,

Gerçek-zamanlı Yüz Nirengi Noktası Takibi

5 yorum yapıldı

eNTERFACE'10'da "Vision-based Hand Puppet" isimli bir proje yürütüyoruz. Projedeki amaç kameradan el ve yüz jestlerini algılayıp sanal bir kuklayı oynatmak. Kısmen sanal gerçeklik de denebilir. Ben yüz ifadelerini algılama kısmıyla ilgileniyorum. Daha önceden yüz jestlerini algılama konusunda çalışmıştım. İlgili çalışmadaki jestler daha çok işaret dilleri özelindeydi, "hayır" anlamında kafayı sağa sola sallamak gibi global kafa hareketlerini de içeriyordu. Şimdi ise yüz ifadesi (gülme, üzülme, şaşkınlık, korku, iğrenme, kızma) tanıma hedefindeyiz. Global kafa hareketlerinin olmadığı (ya da dönmenin olmadığı) bir kurulum üstünde çalışıyoruz. İlk aşama olarak belli noktaları gerçek-zamanlı olarak takip edebilmek geliyor. Takip edilen noktalara dayanarak öznitelikler çıkarıp ifade tanımak da ikinci aşama olacak. İlk aşamaya ait örnek bir görüntü kaydettim. Web kamerasından 640x480'lik çözünürlükte bir çerçeveyi 80 ms gibi bir sürede işleyebiliyor.

Yüz Nirengi Noktası Takibi, Vimeo.

28 Temmuz 2010, Kategori: Genel,