Multiplication de matrice de base dans OpenCV pour Android
Je suis probablement incroyablement stupide ici, mais je vais avoir du mal à faire certaines fondamentalement Tapis de multiplication à l'aide d'OpenCV pour Android.
J'ai deux Tapis est à la fois du même type, CV_64F
mat1
a taille: 3 lignes, 3 colonnes
mat2
a taille: 3 lignes, 1 cols
Je tiens à les multiplier pour donner le produit mat3
de taille 3 lignes, 1 cols.
J'ai essayé à l'aide de:
Mat mat3 = new Mat(3, 1, CvType.CV_64F);
Core.multiply(mat1, mat2, mat3);
Mais j'obtiens une erreur:
CvException
[org.opencv.core.CvException:/home/andreyk/OpenCV2/trunk/opencv_2.3.1.b2/modules/core/src/arithm.cpp:1253:
erreur: (-209) L'opération n'est ni "tableau op tableau" (où les tableaux
avoir la même taille et le même nombre de canaux), ni le " tableau op
scalaire', ni 'scalaire op tableau" dans la fonction void cv::arithm_op(const
cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&,
const cv::_InputArray&, int, void (*)(const char, size_t, const
uchar*, size_t, char*, size_t, cv::Taille, void*), bool, void*)
Que fais-je tort?
Merci pour toute aide à l'avance.
EDIT:
Si cela peut aider, la matrice de 3x3 mat2
est le résultat de Imgproc.getPerspectiveTransform
et le reste du code est comme suit:
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);
OriginalL'auteur woodstock365 | 2012-04-16
Vous devez vous connecter pour publier un commentaire.
Vous sont d'abord essayer d'effectuer l'opération suivante aujourd'hui:
Ici * est la multiplication. Une multiplication de matrice ne peut pas être fait de cette façon. Lire sur la matrice de multiplications ici.
L'opération que vous voulez effectuer est :
Pour obtenir votre code de travail de faire les modifications suivantes:
MODIFIER
Aussi, vous êtes à l'aide de la méthode
Core.multiply
. Dans la documentation de OpenCv, il mentionne:La fonction multiplier calcule pour chaque élément du produit de deux matrices.
Si vous êtes à la recherche d'un produit matriciel, et non par l'élément de produit, voir De base.gemm().
La fonction
gemm(src1, src2, alpha, src3, beta, dest, flags)
effectue la multiplication selon la fonction suivante:Matrice de base multiplcation (dans votre cas) est réalisé par:
Votre matrices sont correctement mis en forme maintenant. Cependant, il semble que vous utilisez la mauvaise méthode. Voir mon edit.
Merci pour l'aide, cela fonctionne à présent. Si j'utilise
null
poursrc3
si je reçois unNullPointerException
, donc pour le moment je suis juste en utilisant la matrice d'identité ici jusqu'à ce que je pourquoi null n'est pas autorisé. Acclamations de nouveau. EDIT:new Mat()
fonctionne très bien commesrc3
donc je vais aller avec ça.Pour
src3
vous pouvez utiliserMat.zeros(rows, cols CvType)
:Core.gemm(mat1, mat2.t(), 1, Mat.zeros(rows, rows, MATRIX_TYPE) , 0, mat3, 0);
Wow, c'est vraiment pas intuitif. J'ai été de me gratter la tête pour la dernière heure demandais pourquoi mon code ne fonctionnait pas. Obv simple tapis vec la multiplication a un nom bizarre et a besoin de 7 arguments... -_-
OriginalL'auteur dennisg
L'inverse à 2 multiplié les matrices :
De base.multiplier(mat2, mat1, mat3);
OriginalL'auteur DarkRift