我试图将图像投影到特征脸变量矩阵,即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相乘。
答案 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);