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.