7

私はおそらくここで信じられないほど愚かですが、Android用のOpenCVを使用して基本的にMat乗算を行うのに問題があります。

同じタイプのマットを2つ持っていますが、CV_64F

mat1サイズ: 3 行、3 列
mat2サイズ: 3 行、1 列

mat3それらを乗算して、サイズが 3 行、1 列の積を取得したいと考えています。

私は使用してみました:

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: error: (-209) The operation is not 'array op array' (配列のサイズとチャネル数は同じ)、'array op scalar'、関数 void cv::arithm_op(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, 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);
4

2 に答える 2

9

基本的に、次の操作を実行しようとしています。

[ 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は、2つの行列の要素ごとの積を計算します。要素ごとの積ではなく、行列積を探している場合は、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);
于 2012-04-16T12:32:55.743 に答える
0

2つの乗算された行列を逆にします:Core.multiply(mat2、mat1、mat3);

于 2012-04-16T04:36:12.210 に答える