web-dev-qa-db-de.com

Opencv multiplizieren Skalar und Matrix

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!

12
Arpan Shah

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
18
Aurelius

etwas wie das. 

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

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;
}
);
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

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);

Doc zu dieser Methode ist hier

0
J.E.Tkaczyk