2013-07-27 22 views
9

Ho cercato di ottenere qualcosa che dovrebbe essere piuttosto banale ed è banale in Matlab.Opencv multiplo scalare e matrice

voglio ottenere semplicemente qualcosa come:

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

Dopo di che campione deve essere solo:

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

ho cercato scaleAdd, Mul, Multiply né consentire un moltiplicatore scalare e richiedono una matrice della stessa "dimensione e tipo". In questo scenario potrei creare una Matrice di Ones e poi usare il parametro di scala ma sembra così molto estraneo

Qualsiasi metodo diretto semplice sarebbe fantastico!

+1

Non dovrebbe '24' essere' 25' invece ??? : P – herohuyongtao

risposta

14

OpenCV supporta infatti la moltiplicazione per un valore scalare con sovraccarico operator*. Potrebbe però essere necessario inizializzare correttamente la matrice.

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 

Se siete interessati soprattutto a operazioni matematiche, cv::Matx è un po 'più facile lavorare con:

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

Questa funzione funziona solo per immagini a canale singolo. Questo quindi non funziona in generale. Dovresti prima dividere tutti i canali e poi ricombinarli, ad esempio \t // (3) Dividere l'immagine RGB \t vector imgPlanes (3); \t split (matImage, imgPlanes); \t Mat matImageK = imgPlanes [0]; – TimZaman

1

qualcosa di simile.

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

per Java non c'è sovraccarico operatore, ma l'oggetto Mat fornisce la funzionalità con un metodo convertto.

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

Doc on this method is here

Problemi correlati