Базовое умножение матриц в OpenCV для Android

Я, наверное, здесь невероятно глуп, но у меня проблемы с базовым умножением Mat с использованием OpenCV для Android.

У меня есть два мэта, оба одного типа, 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) Операция не является операцией массива array '(где массивы имеют одинаковый размер и одинаковое количество каналов), ни' array op scalar ', ни' scalar op array 'в функции 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);

person woodstock365    schedule 16.04.2012    source источник


Ответы (2)


Сейчас вы в основном пытаетесь выполнить следующую операцию:

[ 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 вычисляет произведение двух матриц для каждого элемента. Если вы ищете матричный продукт, а не продукт для отдельных элементов, см. 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);
person dennisg    schedule 16.04.2012
comment
Я с самого начала ошибся с матрицами, как указал DarkRift. Однако мне нужно умножить на матрицу 3x3 слева, которая, как я ожидал, будет работать, как в вашем первом примере выше, но с матрицами наоборот, как показано в Edit? Ваше здоровье. - person woodstock365; 16.04.2012
comment
Теперь ваши матрицы отформатированы правильно. Однако похоже, что вы тоже используете неправильный метод. Смотрите мою правку. - person dennisg; 16.04.2012
comment
Спасибо за помощь, теперь это работает. Если я использую null вместо src3, хотя я получаю NullPointerException, поэтому на данный момент я просто использую здесь матрицу идентичности, пока не выясню, почему null не допускается. Снова ура. РЕДАКТИРОВАТЬ: new Mat() отлично работает как src3, так что я пойду с этим. - person woodstock365; 16.04.2012
comment
Для src3 вы можете использовать Mat.zeros(rows, cols CvType): Core.gemm(mat1, mat2.t(), 1, Mat.zeros(rows, rows, MATRIX_TYPE) , 0, mat3, 0); - person auraham; 03.08.2013
comment
Вау, это так нелепо. Я чесал в затылке последний час, задаваясь вопросом, почему мой код не работает. Obv simple mat vec multiplication имеет странное название и требует 7 аргументов ... -_- - person flakes; 30.05.2017

Переверните ваши 2 умноженные матрицы: Core.multiply (mat2, mat1, mat3);

person DarkRift    schedule 16.04.2012
comment
Я пробовал это, и это почему-то дает мне ту же ошибку, хотя вы правы, что у меня они были неправильными. Спасибо. - person woodstock365; 16.04.2012