2013-04-12 19 views
5

In OpenCV è comune per accedere a un pixel in un oggetto Mat in questo modo:Aprire CV Mat generico intestazioni funzione

float b = A.at<float>(4,5); 

Il problema è che, se non si conosce il tipo di dati a priori, sei incollato. C'è un modo di scrivere intestazioni di funzioni generiche che accetti un Mat con tipo di modello T? Mi piacerebbe creare funzioni per calcoli di algebra lineare e non voglio avere una clausola che separa double e float. Qualcosa di simile:

void func(Mat <T> a) { 
    a.at<T>(3,4) = ... 

E 'possibile in OpenCV?

risposta

1

Questo è possibile semplicemente templating vostra funzione:

template<typename T> 
void func(Mat a) { 
    a.at<T>(3,4) = ... 

Ma nota che non hai modo semplice per vincolo del tipo T ad essere solo doppie o galleggiante, e il vostro algoritmo non probabilmente funzionerà su altri tipi, ma potrebbe non essere un problema reale.

noti inoltre gli svantaggi di utilizzando i modelli: What are the disadvantages of using templates?

+0

Questo codice non viene compilato, hai provato o hai solo indovinato? – nbubis

+0

Non stavo indovinando, ma devo ammettere che non ho provato a compilarlo scusate, ci sono stati errori di battitura all'interno della funzione. – zakinster

+0

Beh, in realtà non ho prestato molta attenzione alla classe Mat di openCV, ho pensato che fosse la classe Mat a suggerire il codice, ma in realtà è solo il metodo, quindi l'errore di battitura è il contrario. L'ultima modifica dovrebbe essere compilata verso la classe Mat openCV. – zakinster

3

Sembra un altro modo per farlo sarebbe quello di utilizzare l'oggetto invece di MatMat_:

template<typename T> 
void func(Mat_ <T> a) { 
    cout << a(0,0) << endl; 
} 

Se si vuole passare un Mat a func, è necessario specificare il tipo:

Mat a; 
func(Mat_<float>(a)); 

Se u Se un tipo diverso rispetto al tipo originale Mat, OpenCV eseguirà la conversione per te.

1

OpenCV 2 Cookbook pagina 40 afferma che è impossibile. Inoltre, per quanto riguarda Mat_:

"Utilizzo al metodo della cv :: classe Mat volte può essere ingombrante perché il tipo restituito deve essere specificato come un argomento di template per ogni chiamata Nei casi in cui il tipo di matrice è noto. , è possibile utilizzare cv :: classe Mat_ che è una sottoclasse di modello cv :: Mat.

cv::Mat_<uchar> im2= image; // im2 refers to image 
im2(50,100)= 0; //access to row 50 and column 100 

Dal momento che il tipo di cv :: Mat_ elementi è dichiarato al momento della creazione della variabile, il metodo operator() sa al momento della compilazione quale tipo restituire. "

EDIT: Uso Mat.type()

uscita
Mat image=imread("image.bmp"); 
cout<<image.type(); 

Console:

16 

Wiki: Il metodo restituisce il tipo di elemento di matrice, un id, compatibile con il sistema di tipo CvMat , come CV_16SC3 o array a 3 canali con firma a 16 bit, ecc.

Problemi correlati