2012-02-24 3 views
3

저는 얼굴 인식 프로젝트를 진행하고 있으며 PCA 부분 공간에 투영 할 때 문제가 있습니다.OpenCV 2.3의 PCA 프로젝트 및 Backproject

크기가 조정 된 이미지가 포함 된 매트 벡터를 크기 조정 이미지에 전달하면 이미지를 투영 한 다음 제대로 작동하는지 재구성하지만 '캠'창에있는 모든 이미지는 회색입니다 (모두 같은 색).

내가 뭘 잘못하고 있는지 모르겠다. 나는이 게시물의 중복 생각

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.); 

승인. 그리고 당신은이 작업을 수행 할 cv::normalize을 사용할 수를 표시하기 전에 0에서 255 사이의 값을 정상화하는 것을 잊지 마세요, 여기에 그레이 스케일로 돌려위한 간단한 기능입니다 :

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

당신이보고 할 수 있습니다 내 블로그 예 : 모든

+0

안녕 bytefish.First, 감사합니다. 나는 "normalize"로 tryied하지만 작동하지 않으므로 알고리즘 (간단한 예제)을 사용하도록 코드를 다시 작성하고 pca.mean을 표시하면 고유 벡터가 모두 검은 색 이미지로 표시됩니다. – user1219145

+0

convertTo가 문제를 해결하면 (제 대답을 편집했습니다) 시도하십시오. 그건 그렇고, 만약 당신이 후면 내 페이지에 Eigenfaces 및 Fisherfaces 구현을 제공하고 있습니다. – bytefish

+0

도움 주셔서 감사합니다. 마지막으로 나는 당신의 블로그에있는 당신의 코드 "Simple Example"을 사용하고있다. 나는 너의 블로그의 나머지를 검사 할 것이다. 다시 한번 감사드립니다. – user1219145