web-dev-qa-db-fra.com

Opencv multiplier scalaire et matrice

J'ai essayé de réaliser quelque chose qui devrait être trivial et qui est trivial dans Matlab .

Je veux simplement réaliser quelque chose comme:

cv::Mat sample = [4 5 6; 4 2 5; 1 4 2];
sample = 5*sample;

Après quel échantillon devrait juste être:

[20 24 30; 20 10 25; 5 20 10]

J'ai essayé scaleAdd, Mul, Multiply et je ne permeti pas un multiplicateur scalaire et j'ai besoin d'une matrice de même "taille et type". Dans ce scénario, je pourrais créer une matrice d’offres puis utiliser le paramètre scale, mais cela me semble très superficiel.

Toute méthode simple directe serait génial!

12
Arpan Shah

OpenCV supporte en effet la multiplication par une valeur scalaire avec operator* surchargé. Cependant, vous devrez peut-être initialiser la matrice correctement.

float data[] = {1 ,2, 3,
                4, 5, 6,
                7, 8, 9};
cv::Mat m(3, 3, CV_32FC1, data);
m = 3*m;  // This works just fine

Si vous êtes principalement intéressé par les opérations mathématiques, cv::Matx est un peu plus facile à utiliser:

cv::Matx33f mx(1,2,3,
               4,5,6,
               7,8,9);
mx *= 4;  // This works too
18
Aurelius

quelque chose comme ça. 

Mat m = (Mat_<float>(3, 3)<<
                    1, 2, 3,
                    4, 5, 6,
                    7, 8, 9)*5;
1
SPV

Pour les gros tapis, utilisez forEach .

Si C++ 11 est disponible:

m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);
1
Black Arrow
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);
0
Syed Safdar Ali

Pour Java, il n'y a pas de surcharge d'opérateur, mais l'objet Mat fournit la fonctionnalité avec une méthode convertTo.

Mat dst= new Mat(src.rows(),src.cols(),src.type());
src.convertTo(dst,-1,scale,offset);

Doc sur cette méthode est ici

0
J.E.Tkaczyk