2011-10-28 25 views
5

Cómo convertir un OpenCV cv::Mat en un float* que se puede alimentar en Vlfeat vl_dsift_process? No puedo entender cómo funciona vl_dsift_process en una matriz flotante unidimensional. Las muestras oficiales solo demuestran cómo usar la API de MatLab. Parece que no hay muestras sobre la API C, y la única pista es el archivo MEX en el paquete fuente.Cómo convertir un OpenCV cv :: Mat en un flotante * que se puede alimentar a Vlfeat vl_dsift_process?

+0

¿Puede ser que este problema esté relacionado con la forma en que se pasa una matriz de Matlab a C? –

Respuesta

11

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

Asegúrese de que la matriz no se elimina/sale del ámbito antes de terminar con el puntero a los datos. Y asegúrese de que la matriz contenga flotadores.

+1

Se debe verificar que la matriz sea continua, de lo contrario no se puede interpretar como una matriz unidimensional. Y creo que es más apropiado usar 'reinterpret_cast' aquí ya que indica claramente la naturaleza peligrosa de este elenco. De todos modos, la extracción de DSIFT probablemente sería de varios órdenes de magnitud más lenta que la conversión de la matriz a 'vector ', así que creo que la sobrecarga asociada es insignificante y vale la pena la seguridad y la portabilidad añadidas. – lizarisk

4

No puedo entender cómo funciona vl_dsift_process en una matriz de flotador unidimensional

DSIFT espera una imagen en escala de grises, donde cualquier intensidad de píxel (x, y) se almacena en float_array [anchura y * + x] como valor flotante. En OpenCV, las imágenes se almacenan como caracteres sin signo para que la simple conversión de Mat :: data a float * no funcione. Debe convertir manualmente todos los valores a flotación:

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]); 
Cuestiones relacionadas