Ich habe versucht, etwas zu erreichen, das ziemlich trivial sein sollte und in Matlab trivial ist.
Ich möchte einfach etwas erreichen wie:
cv::Mat sample = [4 5 6; 4 2 5; 1 4 2];
sample = 5*sample;
Nach welcher Probe sollte nur sein:
[20 24 30; 20 10 25; 5 20 10]
Ich habe scaleAdd
, Mul
, Multiply
ausprobiert, und beide erlauben keinen Skalar-Multiplikator und benötigen eine Matrix der gleichen Größe und Art. In diesem Szenario könnte ich eine Matrix von Einsen erstellen und dann den Skalierungsparameter verwenden, aber das scheint sehr unwichtig zu sein
Jede direkte einfache Methode wäre großartig!
OpenCV unterstützt tatsächlich die Multiplikation mit einem skalierten Wert mit überladenem operator*
. Möglicherweise müssen Sie jedoch die Matrix korrekt initialisieren.
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
Wenn Sie sich hauptsächlich für mathematische Operationen interessieren, ist cv::Matx
etwas einfacher zu handhaben:
cv::Matx33f mx(1,2,3,
4,5,6,
7,8,9);
mx *= 4; // This works too
etwas wie das.
Mat m = (Mat_<float>(3, 3)<<
1, 2, 3,
4, 5, 6,
7, 8, 9)*5;
Für große Matten sollten Sie forEach verwenden.
Wenn C++ 11 verfügbar ist:
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);
Für Java gibt es keine Operatorüberladung, das Mat-Objekt stellt die Funktionalität jedoch mit einer convertTo-Methode bereit.
Mat dst= new Mat(src.rows(),src.cols(),src.type());
src.convertTo(dst,-1,scale,offset);