#include <opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include <iostream>
#include<conio.h>
using namespace cv;
using namespace std;
int main()
{
Mat im= imread("D:\\try.jpg"),newface,A;
Mat im2 = imread("D:\\project\\barc\\variables\\Eigenface.jpg");
cvtColor(im, im, CV_BGR2GRAY);
cvtColor(im2, im2, CV_BGR2GRAY);
resize(im, im, Size(48, 48));
newface = im.reshape(0, 2304);
newface.convertTo(newface, CV_32FC1);
im2.convertTo(im2, CV_32FC1);
cout << "Diff : " << newface.size() << "\t" << "channels" << newface.channels() << endl;
cout << "Eigen : " << im2.size() << "\t" << "channels" << im2.channels() << endl;
A = im2*newface.t();
_getch();
return 0;
}
Eigenface.jpg具有维度(9x2304)。当我与我面临的形象相乘时,这个错误即将到来,任何人都可以帮忙吗?
答案 0 :(得分:3)
请检查矩阵M1,M2 M1.cols == M2.rows。 如果它们不相等,那么乘法是不可能的!
答案 1 :(得分:0)
打印矩阵宽度(cols)和高度(行)并查看问题:Eigenface.cols = 9
和diff_test_image.rows = 2304
。两者必须相等才能进行乘法运算。做:
test_omega = (Eigenface.t())*diff_test_image;
在代码后编辑:
它在cout << "Diff : " << newface.size() << "\t" << "channels" << newface.channels() << endl;
的行中打印了什么?下一个怎么样?大小为Eigenface.jpg
的{{1}}是?我不这么认为......
即使9x2304
,您正在乘以应位于im2.rows == 2304
前面的列向量,或只是尝试使用im2
来获得列向量,因此它的转置将是一个行向量
答案 2 :(得分:0)
Mat M1(9,2304,CV_32F, Scalar(1));
Mat M2(2304,1, CV_32F, Scalar(2));
Mat M3 = M1 * M2;
cerr << M3.size() << endl;
cerr << M3 << endl;
[1 x 9]
[4608; 4608; 4608; 4608; 4608; 4608; 4608; 4608; 4608]
(顺便说一下,如果你打算在那里进行子空间投影,你必须先从diff_test_image中减去均值)