问题乘以Mat矩阵

时间:2013-12-13 09:16:58

标签: c++ opencv matrix-multiplication

我试图将图像投影到特征脸变量矩阵,即opencv的EigenFacesRecognizer返回。我使用以下代码加载加载图像的特征脸参数,并尝试将样本图像投影到pca子空间。

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 Mat,因为当我尝试计算nu * .nu.t();(1x3600 * 3600x1)时,它会返回相同的问题。我是否因为重塑功能而遇到麻烦?我试图将我的样本垫转换为矢量,它似乎有效,但我无法理解为什么我甚至不能将nu与nu_transposed相乘。

1 个答案:

答案 0 :(得分: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);