我可能在这里非常愚蠢但是我在使用OpenCV for Android做一些基本的Mat乘法时遇到了麻烦。
我有两个相同类型的Mat,CV_64F
mat1
的大小: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)该操作既不是'数组操作数组'(其中数组 具有相同的大小和相同数量的通道),也不是'数组op 函数void cv :: arithm_op(const。)中的标量',''标量运算数组' cv :: _ InputArray&,const cv :: _ InputArray&,const cv :: _ OutputArray&amp ;,, 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);
答案 0 :(得分:9)
您现在基本上尝试执行以下操作:
[ 0 ] [ 0 1 2 ]
[ 1 ] * [ 3 4 5 ]
[ 2 ] [ 6 7 8 ]
在这里*是乘法。矩阵乘法不能以这种方式完成。阅读矩阵乘法here。
您想要执行的操作是:
[ 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);
答案 1 :(得分:0)
反转你的2个乘法矩阵: Core.multiply(mat2,mat1,mat3);