Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android版OpenCV中的基本矩阵乘法_Java_Android_Opencv_Matrix_Multiplication - Fatal编程技术网

Java Android版OpenCV中的基本矩阵乘法

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

我在这里可能非常愚蠢,但我在使用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.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个参数-_-