Як перетворити OpenCV cv :: Mat у плаваюче *, яке можна додати до Vlfeat vl_dsift_process?

Як перетворити OpenCV cv :: Mat в float * , який можна ввести у файл Vlfeat vl_dsift_process ? Я не можу зрозуміти, як працює vl_dsift_process в одномірному масивові з плаваючою структурою. Офіційні зразки лише показують, як використовувати MatLab API. Схоже, що немає зразків щодо C API, і єдиним ключем є файл MEX у вихідному пакеті.

5
Може бути, ця проблема пов'язана з тим, як матриця передається від Matlab до C?
додано Автор Jiayuan Ma, джерело

2 Відповіді

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

Переконайтеся, що матриця не видаляється/виходить за рамки, перш ніж закінчити використання покажчика на дані. І переконайтеся, що матриця містить поплавки.

11
додано
Матриця повинна бути перевірена як неперервна, інакше вона не може бути інтерпретована як одномірний масив. І я думаю, що краще використовувати тут reinterpret_cast , оскільки це чітко вказує на небезпечну природу цього актерського матеріалу. У будь-якому випадку, видобуток DSIFT, ймовірно, буде на багато порядків набагато повільніше, ніж перетворення матриці в vector , тому я думаю, що пов'язані накладні витрати є незначними і варті додаткової безпеки та портативності.
додано Автор lizarisk, джерело

Я не можу зрозуміти, як vl_dsift_process працює на одномірному плаваючому масиві

DSIFT очікує зображення у градаціях сірого, де інтенсивність пікселя (x, y) зберігається в float_array [y * width + x] як значення float. У OpenCV зображення зберігаються як непідписані символи, тому простої конверсії Mat :: даних для плавання * не працюватимуть. Вам потрібно вручну перетворити кожне значення на плаваюче:

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

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

vl_dsift_process(dsift, &img[0]);
4
додано