2011-09-28 106 views
2

我想在OpenCV中創建一個PCA模型來保存像素座標。作爲一個實驗,我有兩組像素座標映射出兩個近似圓。每組座標都有48個x,y對。我正在試驗下面的代碼,它從文件讀取座標並將它們存儲在Mat結構中。但是,我認爲這是不正確的,openCV中的PCA似乎在互聯網上很差。OpenCV PCA問題

Mat m(2, 48, CV_32FC2); // matrix with 2 rows of 48 cols of floats held in two channels 

pFile = fopen("data.txt", "r"); 

for (int i=0; i<48; i++){ 
    int x, y; 
    fscanf(pFile, "%d%c%c%d%c", &x, &c, &c, &y, &c); 

    m.at<Vec2f>(0 , i)[0] = (float)x; // store x in row 0, col i in channel 0 
    m.at<Vec2f>(0 , i)[1] = (float)y; // store y in row 0, col i in channel 1 

} 

for (int i=0; i<48; i++){ 
    int x, y; 
    fscanf(pFile, "%d%c%c%d%c", &x, &c, &c, &y, &c); 

    m.at<Vec2f>(1 , i)[0] = (float)x; // store x in row 1, col i in channel 0 
    m.at<Vec2f>(1 , i)[1] = (float)y; // store y in row 1, col i in channel 1 

} 

PCA pca(m, Mat(), CV_PCA_DATA_AS_ROW, 2); // 2 principle components??? Not sure what to put here e.g. is it 2 for two data sets or 48 for number of elements? 

    for (int i=0; i<48; i++){ 
float x = pca.mean.at<Vec2f>(i,0)[0]; //get average x 
    float y = pca.mean.at<Vec2f>(i,0)[1]; //get average y 
    printf("\n x=%f, y=%f", x, y); 
} 

但是,這在創建pca對象時崩潰。我知道這是一個非常基本的問題,但我有點失落,並希望有人能讓我開始在開放的簡歷pca。

+0

您是否看過[OpenCV文檔的PCA部分](http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html#pca)? –

回答

3

如果您進一步詳細描述了需要使用PCA以及您希望實現(輸出?)的內容,這可能會有所幫助。

我相當確定你的程序崩潰的原因是因爲輸入Mat是CV_32FC2,它應該是CV_32FC1。在使用PCA之前,您需要將數據重塑爲1維行向量,不知道您需要什麼我無法說出如何重塑您的數據。 (圖像的常見應用是eigenFace,它需要將圖像重新整形爲一個行向量)。此外,您需要將輸入數據標準化爲0到1之間的數字。

作爲另一方面,通常您會選擇保留少於1個輸入樣本的主成分,因爲最後一個主成分與其他主成分簡單地正交。

我曾經與opencv PCA合作過,希望能夠進一步提供幫助。我也會把你推薦到這個博客:http://www.bytefish.de/blog/pca_in_opencv,它幫助我開始使用openCV中的PCA。

+0

嗨凱文,謝謝你的回答,併爲延誤回覆感到抱歉,因爲我一直生病了煙!我想要做的是爲圖像中的嘴部創建一個pca模型。我所做的是在兩張圖像中嘴巴周圍的採樣點,並且想根據我的採樣點創建一個pca模型。因此,在第一幅圖像中,我有48(x,y)座標跟隨着飛蛾的形狀,而在第二幅圖像中,我有另外48個點用於不同的嘴。然後我想獲得平均的嘴巴座標。我一直在試圖找到有用的在線資源,但沒有運氣。 – user969776

+0

我會看看你推薦的博客,因爲它看起來很有用。任何進一步的提示和技巧,如何創建所需的模型將非常感激(如果您或任何人有時間)... – user969776

+0

嗨凱文,再次感謝您的幫助。我設法使用CV_32FC1編譯代碼,並按照您所說的規範化數據。有趣的是,來自具有更多經驗的人的一些提示可以幫助我們在Google上尋找答案時爲我們帶來許多心痛。互聯網上有很多關於PCA的優秀資源,但很少有PCA與OpenCV的例子。所以非常感謝您的幫助,這真是太棒了! – user969776