2013-07-27 13 views
9

Ich habe versucht, etwas zu erreichen, was ziemlich trivial und trivial sein sollte in Matlab.Opencv multiplizieren Skalar und Matrix

Ich möchte einfach etwas erreichen wie:

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

Ich habe scaleAdd versucht, Mul, Multiply und weder erlauben einen skalaren Multiplikators und erfordern:

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

Nach dem Probe gerade sein sollte eine Matrix der gleichen "Größe und Art". In diesem Szenario könnte ich eine Matrix von Ones erstellen und dann den Skalierungsparameter verwenden, aber das scheint so sehr außerhalb

Jede direkte einfache Methode wäre großartig!

+1

Sollte nicht '24' sein' 25' statt ??? : P – herohuyongtao

Antwort

14

OpenCV unterstützt tatsächlich die Multiplikation mit einem skalaren Wert mit überladenem operator*. Möglicherweise müssen Sie die Matrix jedoch richtig 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 in mathematischen Operationen hauptsächlich interessiert sind, cv::Matx ist ein wenig einfacher zu handhaben:

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

Diese Funktion funktioniert nur für Bilder mit einem Kanal. Dies funktioniert daher nicht allgemein. Sie müssten zuerst alle Kanäle aufteilen und dann neu kombinieren, zB \t // (3) Split das RGB Bild \t Vektor imgPlanes (3); \t split (matImage, imgPlanes); \t Matte matImageK = imgPlanes [0]; – TimZaman

1

so etwas wie dieses.

Mat m = (Mat_<float>(3, 3)<< 
        1, 2, 3, 
        4, 5, 6, 
        7, 8, 9)*5; 
0
Mat A = //data;//source Matrix 
Mat B;//destination Matrix 
Scalar alpha = new Scalar(5)//factor 
Core.multiply(A,alpha,b); 
0

für Java gibt es keine Überladen von Operatoren, aber das Mat-Objekt stellt die Funktionalität mit einer convertTo Methode.

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

Doc on this method is here