断言失败(a_size.width == len)在cv :: gemm中

时间:2014-08-19 07:17:13

标签: opencv visual-c++

#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)。当我与我面临的形象相乘时,这个错误即将到来,任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

请检查矩阵M1,M2 M1.cols == M2.rows。 如果它们不相等,那么乘法是不可能的!

答案 1 :(得分:0)

打印矩阵宽度(cols)和高度(行)并查看问题:Eigenface.cols = 9diff_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中减去均值)