7

我在这里可能非常愚蠢,但是我在使用 OpenCV for Android 进行一些基本的 Mat 乘法时遇到了麻烦。

我有两个相同类型的垫子,CV_64F

mat1大小:3 行,3 列
mat2大小:3 行,1 列

我想将它们相乘以得到mat3大小为 3 行、1 列的乘积。

我试过使用:

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: error: (-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 矩阵mat2是结果,Imgproc.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);
4

2 回答 2

9

您现在基本上是在尝试执行以下操作:

[ 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);
于 2012-04-16T12:32:55.743 回答
0

反转您的 2 个相乘矩阵: Core.multiply(mat2, mat1, mat3);

于 2012-04-16T04:36:12.210 回答