2013-12-13 4 views
2

opencv의 EigenFacesRecognizer가 반환하는 고유 공분산 행렬에 이미지를 투영하려고합니다. 다음 코드를 사용하여 이미지를로드하고 샘플 이미지를 pca 하위 영역에 투영하려고하는 eigenfaces 매개 변수를로드합니다.매트 행렬 곱하기 문제

Ptr<FaceRecognizer> model = createEigenFaceRecognizer(); 
model->load("eigenfaces.yml"); // Load eigenfaces parameters 
Mat eigenvalues = model->getMat("eigenvalues"); // Eigen values of PCA 
Mat convMat = model->getMat("eigenvectors"); //Convariance matrix 
Mat mean = model->getMat("mean"); // Mean value 

string path = fileName; 

Mat sample ,pca_ed_sample; 
sample = imread(path, CV_LOAD_IMAGE_GRAYSCALE); //size 60x60 
Mat nu = sample.reshape(1,3600).t(); //1x3600 
pca_ed_sample = (nu - mean)*(convMat); 

나는 5 개 고유 벡터를 유지하고, 그래서 고유의 5x1의 크기는 convMat3600x5는 1x3600을 의미한다. 내가 pca_ed_sample을 계산하려고 할 때 그것은 나를 반환

cv::Exception at memory location 0x0011d300.Dimensionality reduction using default opencv eigenfaces... 
    OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type == 
    CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) in unknown function, file .\ 
    src\matmul.cpp, line 711` 

문제는 내가) (* .nu.t을 뉴을 계산하려고 할 때부터 뉴 매트에 서 (1x3600 * 3600x1)는 같은 문제를 반환합니다. 재 형성 기능 때문에 문제가 있습니까 ?? 내 샘플 매트를 벡터로 변형하려고 시도하고 있지만 작동하는 것처럼 보이지만 nu_transposed로 nu를 곱하지 않는 이유를 이해할 수 없습니다.

답변

2

매트릭스 곱셈은 부동 소수점 데이터에서만 가능하며, 이는 어설 션 오류로 알려줍니다.

이미지가 CV_8U 유형으로로드되므로 먼저 convertTo 멤버를 사용하여 이미지를 플로트로 재조정해야합니다.

sample = imread(path, CV_LOAD_IMAGE_GRAYSCALE); //size 60x60 
cv::Mat sample_float; 
sample.convertTo(sample_float, CV_32F); // <-- Convert to CV_32F for matrix mult 
Mat nu = sample_float.reshape(1,3600).t(); //1x3600 
pca_ed_sample = (nu - mean)*(convMat); 
+0

나는 convMat과 동일하게 작동합니다. 감사합니다! –