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!
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
quelque chose comme ça.
Mat m = (Mat_<float>(3, 3)<<
1, 2, 3,
4, 5, 6,
7, 8, 9)*5;
Pour les gros tapis, utilisez forEach .
Si C++ 11 est disponible:
m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);
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);