OpenCV中的矩阵乘法

bis*_*nga 37 opencv

我在OpenCV中有两个Mat图像:

Mat ft = Mat::zeros(src.rows,src.cols,CV_32FC1);
Mat h = Mat::zeros(src.rows,src.cols,CV_32FC1);
Run Code Online (Sandbox Code Playgroud)

两个图像都是相同的尺寸,并且是从单个源图像计算出来的.

我想将这两个图像相乘但尝试使用这两个图像

Mat multiply1 = h*ft;

Mat multiply2;
gemm(h,ft,1,NULL,0,multiply2);
Run Code Online (Sandbox Code Playgroud)

但两者都会导致以下断言失败:

OpenCV错误:断言失败(a_size.width == len)在未知函数中,文件... matmul.cpp抛出'cv :: exception'后调用终止

我究竟做错了什么?

Chr*_*ris 105

你说矩阵是相同的维度,但你正在尝试对它们执行矩阵乘法.只有当它们是正方形时,才可能将具有相同尺寸的矩阵相乘.在您的情况下,您会收到断言错误,因为尺寸不是正方形.乘法矩阵时必须小心,因为乘法有两种可能的含义.

矩阵乘法是两个矩阵直接相乘的地方.该操作将大小为[axb]的矩阵A与大小为[bxc]的矩阵B相乘,以产生大小为[axc]的矩阵C. 在OpenCV中,使用简单的*运算符实现:

C = A * B
Run Code Online (Sandbox Code Playgroud)

逐元素乘法是输出矩阵中的每个像素通过将矩阵A中的像素乘以矩阵B中的对应条目而形成的.输入矩阵应该是相同的大小,并且输出也将是相同的大小.这是使用以下mul()功能实现的:

output = A.mul(B);
Run Code Online (Sandbox Code Playgroud)

  • 因为现在,h*ft试图执行矩阵乘法,注意h和ft是如何形成的,需要src.rows == src.cols. (3认同)
  • JAVA不支持*运算符.您必须使用Core.gemm方法. (2认同)