【问题标题】:Basic matrix multiplication in OpenCV for AndroidOpenCV for Android 中的基本矩阵乘法
【发布时间】:2012-04-27 10:11:44
【问题描述】:

我在这里可能非常愚蠢,但我在使用 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)该操作既不是“数组操作数组”(其中数组 具有相同的大小和相同的通道数),也不是'array op 函数 void cv::arithm_op(const cv::_InputArray&, 常量 cv::_InputArray&, 常量 cv::_OutputArray&, const cv::_InputArray&, int, void (*)(const uchar, size_t, const uchar*, size_t, uchar*, size_t, cv::Size, void*), bool, void*)


我做错了什么?

感谢您提前提供任何帮助。

编辑:
如果有帮助,3x3 矩阵mat2Imgproc.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);

【问题讨论】:

    标签: java android opencv matrix multiplication


    【解决方案1】:

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

    【讨论】:

    • 我试过这个,它给了我同样的错误,虽然你是对的,我把它们弄错了。谢谢。
    【解决方案2】:

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

    [ 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);
    

    【讨论】:

    • 正如 DarkRift 指出的那样,我一开始就把矩阵弄错了。但是,我需要与左侧的 3x3 矩阵相乘,我希望它可以像上面的第一个示例一样工作,但是矩阵反过来,如 Edit?干杯。
    • 您的矩阵现在格式正确。但是,您似乎也使用了错误的方法。查看我的编辑。
    • 感谢您的帮助,现在可以使用了。如果我将null 用于src3,尽管我得到了NullPointerException,所以目前我只是在这里使用单位矩阵,直到我弄清楚为什么不允许使用null。再次欢呼。编辑:new Mat()src3 一样工作正常,所以我会继续这样做。
    • 对于src3,你可以使用Mat.zeros(rows, cols CvType)Core.gemm(mat1, mat2.t(), 1, Mat.zeros(rows, rows, MATRIX_TYPE) , 0, mat3, 0);
    • 哇,这太不直观了。过去一个小时我一直在摸不着头脑,想知道为什么我的代码不起作用。 Obv 简单的 mat vec 乘法有一个奇怪的名字,需要 7 个参数... -_-
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多