Java Android版OpenCV中的基本矩阵乘法
我在这里可能非常愚蠢,但我在使用Android的OpenCV进行一些基本的Mat乘法时遇到了麻烦 我有两个相同类型的垫子,Java Android版OpenCV中的基本矩阵乘法,java,android,opencv,matrix,multiplication,Java,Android,Opencv,Matrix,Multiplication,我在这里可能非常愚蠢,但我在使用Android的OpenCV进行一些基本的Mat乘法时遇到了麻烦 我有两个相同类型的垫子,CV\u 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.CvExcepti
CV\u 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::_输入阵列和常数cv:_输入阵列和常数cv:_输出阵列和常数, 常量cv::_InputArray&,int,void(*)(常量uchar,大小,常量 uchar*,size\u t,uchar*,size\u 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);
反转2个相乘矩阵:
Core.multiply(mat2、mat1、mat3);您现在基本上正在尝试执行以下操作:
[ 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计算两个矩阵的每元素乘积。
如果要查找矩阵积,而不是每元素积,请参阅
函数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矩阵相乘,我希望它能像上面的第一个例子一样工作,但与前面的矩阵相乘e另一方面,如编辑?干杯中所示。您的矩阵现在格式正确。但是,似乎您也使用了错误的方法。请参阅我的编辑。感谢帮助,现在可以了。如果我对
src3
使用null
,尽管我得到了一个NullPointerException
,所以目前我只使用标识矩阵h直到我弄明白为什么不允许空。再次干杯。编辑:new Mat()
与src3
一样工作正常,所以我会继续。对于src3
您可以使用Mat.zeros(rows,cols CvType)
:Core.gemm(mat1,mat2.t(),1,Mat.zeros(rows,rows,Mat类型),0,mat3,0)
哇,这太不直观了。过去一个小时我一直在挠头,想知道为什么我的代码不起作用。Obv simple mat vec乘法有一个奇怪的名字,需要7个参数-_-