2012-02-24 63 views
3

我正在進行人臉識別項目,我在PCA子空間投影時遇到問題。PCA項目和OpenCV 2.3中的後項目(C++)

當我通過調整大小的圖像將mat矢量傳遞給我的函數時,我將它們投影,然後重構它們以驗證它運行正常,但是我在「凸輪」窗口中的所有圖像都是灰色圖像(全部顏色相同)。

我不知道我在做什麼壞事。

這是函數:

void doPCA (const vector<Mat>& images) 
{ 
int nEigens = images.size()-1; 
Mat data (images.size(), images[0].rows*images[0].cols, images[0].type()); 
for (int i = 0; i < images.size(); i++) 
{ 
Mat aux = data.row(i); 
images[i].reshape(1,1).copyTo(aux); 
} 
PCA pca(data,Mat(),CV_PCA_DATA_AS_ROW,nEigens); 

//Project images 
Mat dataprojected(data.rows, nEigens, CV_32FC1) ; 
for(int i=0; i<images.size(); i++) 
{ 
pca.project(data.row(i), dataprojected.row(i)); 
} 

//Backproject to reconstruct images 
Mat datareconstructed (data.rows, data.cols, data.type()); 
for(int i=0; i<images.size(); i++) 
{ 
pca.backProject (dataprojected.row(i), datareconstructed.row(i)); 
} 
for(int i=0; i<images.size(); i++) 
{ 
imshow ("Cam", datareconstructed.row(i).reshape(1,images[0].rows)); 
waitKey(); 
} 
} 

回答

2

我覺得這個職位的副本:

啊,我發現在你的代碼中的錯誤。當您創建數據矩陣你這樣做:

images[i].reshape(1,1).copyTo(aux); 

你必須使用的ConvertTo將數據轉換爲正確的類型,並把它複製到你的數據矩陣:

images[i].reshape(1,1).convertTo(aux, CV_32FC1, 1/255.); 

然後歸一化的特徵向量應好。而且不要忘記顯示在他們面前正常化0和255之間的值,可以使用cv::normalize要做到這一點,這裏有一個簡單的功能將其變成灰色:

Mat toGrayscale(const Mat& src) { 
    Mat srcnorm; 
    cv::normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1); 
    return srcnorm; 
} 

你可能想看看例如,在我的博客:

+0

大家的bytefish.First,謝謝。我試着用「正常化」但它不起作用,所以我重寫我的代碼來使用你的算法(簡單的例子),如果我顯示pca.mean和特徵向量,所有我看到的是一個黑色的圖像。 – user1219145 2012-03-04 17:39:22

+0

如果convertTo解決您的問題,請嘗試(我編輯了我的答案)。順便說一句,我在頁面上提供了一個Eigenfaces和Fisherfaces實現,如果這就是你所追求的。 – bytefish 2012-03-04 18:59:35

+0

感謝您的幫助。最後,我使用您的博客上的代碼「簡單示例」,它運行良好。我會檢查你的博客的其餘部分。再次感謝。 – user1219145 2012-03-17 13:19:09