2013-12-13 55 views
2

我在尝试将图像投影到opencv的EigenFacesRecognizer返回的特征脸协方差矩阵。我使用下面的代码来加载载入图像的eigenfaces参数并尝试将样本图像投影到pca子空间。Mat矩阵相乘的问题

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垫,因为当我试图计算NU * .nu.t();(1x3600 * 3600x1)返回相同的问题。我是否因重塑功能而有麻烦?我试图将我的示例垫转换为矢量,它似乎工作,但我不明白为什么我甚至不能将nu与nu_transposed相乘。

回答

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做了同样的工作,谢谢! –