OpenCV在Android中的基本矩阵乘法

8
我可能太蠢了,但我在使用OpenCV for Android做一些基本的矩阵乘法时遇到了麻烦。
我有两个相同类型的Mat,都是CV_64Fmat1的大小为:3行,3列 mat2的大小为:3行,1列
我想将它们相乘得到大小为3行,1列的mat3
我已经尝试过使用:
Mat mat3 = new Mat(3, 1, CvType.CV_64F);
Core.multiply(mat1, mat2, mat3);


但是我收到了一个错误:

CvException [org.opencv.core.CvException:/home/andreyk/OpenCV2/trunk/opencv_2.3.1.b2/modules/core/src/arithm.cpp:1253: 错误: (-209) 操作既不是 'array op array' (数组具有相同的大小和相同的通道数), 也不是 'array op scalar', 也不是 'scalar op array',在函数 void cv::arithm_op(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, const cv::_InputArray&, int, void (*)(const uchar, size_t, const uchar*, size_t, uchar*, size_t, cv::Size, void*), bool, void*)


我做错了什么?

提前感谢任何帮助。

编辑:
如果方便的话, 3x3矩阵mat2Imgproc.getPerspectiveTransform的结果, 其余代码如下:

Mat mat1 = new Mat(3, 1, CvType.CV_64F);
mat1.put(0, 0, 2.0);
mat1.put(1, 0, 0.5);
mat1.put(2, 0, 1.0);

Mat mat3 = new Mat(3, 1, CvType.CV_64F);
Core.multiply(mat2, mat1, mat3);
2个回答

11
你现在基本上正在尝试执行以下操作:
[ 0 ]   [ 0 1 2 ]
[ 1 ] * [ 3 4 5 ]
[ 2 ]   [ 6 7 8 ]

这里的 * 表示乘法。矩阵乘法不能用这种方式进行。请在这里了解矩阵乘法。

您想要执行的操作是:

            [ 0 1 2 ]
[ 0 1 2 ] * [ 3 4 5 ]
            [ 6 7 8 ]

为了让您的代码正常工作,请进行以下更改:

Mat mat1 = new Mat(1, 3, CvType.CV_64F); // A matrix with 1 row and 3 columns
mat1.put(0, 0, 2.0); // Set row 1 , column 1
mat1.put(0, 1, 0.5); // Set row 1 , column 2
mat1.put(0, 2, 1.0); // Set row 1 , column 3

编辑

还有,你正在使用Core.multiply方法。在OpenCv的文档中提到:

函数multiply计算两个矩阵的逐元素乘积。

如果您要寻找矩阵乘积而不是逐元素乘积,请参见Core.gemm()

函数gemm(src1, src2, alpha, src3, beta, dest, flags)根据以下函数执行乘法:

dest = alpha * src1 * src2 + beta * src3

在你的情况下,基本矩阵乘法是这样做的:

Core.gemm(mat2, mat1, 1, NULL, 0, mat3, 0);

一开始我把矩阵搞反了,正如DarkRift所指出的那样。然而,我需要左乘3x3矩阵,就像你上面的第一个例子一样,但是矩阵的顺序相反,就像编辑中展示的那样?谢谢。 - woodstock365
你的矩阵格式现在已经正确了。然而,似乎你也使用了错误的方法。请查看我的编辑。 - dennisg
4
感谢你的帮助,现在它可以工作了。不过,如果我在src3中使用null,就会得到NullPointerException,所以现在我只是在这里使用单位矩阵,直到我弄清楚为什么不允许使用null。再次感谢。 编辑:new Mat() 用于 src3 可以正常工作,所以我将采用它。 - woodstock365
1
对于 src3,您可以使用 Mat.zeros(rows, cols CvType)Core.gemm(mat1, mat2.t(), 1, Mat.zeros(rows, rows, MATRIX_TYPE) , 0, mat3, 0); - auraham
2
哇,这太不直观了。我已经想了一个小时,为什么我的代码不起作用。显然,简单的矩阵向量乘法有一个奇怪的名称,并且需要7个参数... -_- - flakes

0

翻转您的两个乘法矩阵: Core.multiply(mat2, mat1, mat3);


我尝试过这个,但不知何故它仍然给我相同的错误,尽管你是正确的,我把它们搞反了。谢谢。 - woodstock365

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接