2011-10-28 14 views
5

Come convertire un OpenCV cv::Mat in un float* che può essere alimentato in Vlfeat vl_dsift_process? Non riesco a capire come funziona vl_dsift_process su un array float unidimensionale. Gli esempi ufficiali dimostrano solo come utilizzare l'API MatLab. Sembra che non ci siano esempi sull'API C e l'unico indizio è il file MEX nel pacchetto sorgente.Come convertire un OpenCV cv :: Mat in un float * che può essere inserito in Vlfeat vl_dsift_process?

+0

Può essere che questo problema sia legato al modo in cui una matrice viene passata da Matlab a C? –

risposta

11

float* matData = (float*)myMat.data;

Assicurarsi che la matrice non viene eliminato/va fuori del campo di applicazione prima di finire utilizzando il puntatore ai dati. E assicurati che la matrice contenga galleggianti.

+1

La matrice deve essere controllata per essere continua, altrimenti non può essere interpretata come una matrice unidimensionale. E penso che sia più appropriato usare 'reinterpret_cast' qui in quanto indica chiaramente la natura pericolosa di questo cast. In ogni caso, l'estrazione di DSIFT sarebbe probabilmente di molti ordini di grandezza più lenta rispetto alla conversione della matrice in 'vector ', quindi penso che il sovraccarico associato sia trascurabile e meriti la maggiore sicurezza e portabilità. – lizarisk

4

non riesco a capire come funziona vl_dsift_process su una matrice galleggiante unidimensionale

DSIFT aspetta una scala di grigio in cui intensività di pixel (x, y) è memorizzato in float_array [larghezza y * + x] come valore float. Nelle immagini OpenCV le immagini vengono memorizzate come caratteri non firmati, quindi la semplice conversione di Mat :: data in float * non funzionerà. Devi convertire manualmente ogni valore in float:

Mat mat = imread("image_name.jpg", 0); // 0 stands for grayscale 

vector<float> img; 
for (int i = 0; i < mat.rows; ++i) 
    for (int j = 0; j < mat.cols; ++j) 
    img.push_back(mat.at<unsigned char>(i, j)); 

vl_dsift_process(dsift, &img[0]); 
Problemi correlati