在OpenCV的基本矩阵乘法为Android(Basic matrix multiplication

2019-06-23 15:52发布

我可能是难以置信的愚蠢在这里,但我无法做的OpenCV采用Android的一些basicaly垫乘法。

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

mat1具有尺寸:3行,3个COLS
mat2具有尺寸:3行,1个COLS

我想将它们相乘得到产品mat3尺寸3排,1周的cols的。

我已经尝试使用:

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)的动作既不是“数组运算阵列”(其中阵列具有相同的尺寸和相同的信道数目),也不‘在功能无效CV :: arithm_op阵列运算标量’,也不是‘的标量运算数组’(常量CV :: _ InputArray&,常量CV :: _ InputArray&,常量CV :: _ OutputArray&,常量CV :: _ InputArray&,INT,无效(*)(const的UCHAR,为size_t,const的UCHAR *,为size_t,UCHAR *,为size_t,CV ::尺寸,无效*),布尔,无效*)


我究竟做错了什么?

感谢提前任何帮助。

编辑:
如果有帮助,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);

Answer 1:

您basicly想现在执行以下操作:

[ 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中的文档它提到:该功能乘法计算两个矩阵的每个元素的产品。 如果你正在寻找一个矩阵的产品,而不是每个元素的产品,请参见Core.gemm() 。

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

dest = alpha * src1 * src2 + beta * src3

基本矩阵multiplcation(你的情况)由完成:

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


Answer 2:

扭转你的2个倍增矩阵:Core.multiply(MAT2,MAT1,MAT3);



文章来源: Basic matrix multiplication in OpenCV for Android