Конвертировать Mat в ** float - PullRequest
0 голосов
/ 17 октября 2011

У меня есть функция OpenCV, тип возвращаемого значения - Mat. Как мне преобразовать это в двумерный массив с плавающей точкой (** float)?

Возможно, очень просто, но я не смог сделать это сам.

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Беглый взгляд на документацию для Mat класса не обнаруживает очевидного оператора 'convert to float**', но вы, вероятно, могли бы сделать это вручную:

 Mat mat = (Mat_<float>(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);

 // allocate and initialize a 2d float array
 float **m = new float*[mat.Rows];
 for (int r = 0; r < mat.Rows; ++r)
 {
    m[r] = new float[mat.Cols];
    for (int c = 0; c < mat.Cols; ++c)
    {
       m[r][c] = mat.at(r, c);
    }
 }

 // (use m for something)

 // don't forget to clean up!
 for (int r = 0; r < mat.Rows; ++r)
 {
    delete[] m[r];
 }
 delete[] m;

Если вы не настроены на использование float**, вы можете использовать std::vector или boost::multi_array, чтобы избежать неуклюжего выделения / освобождения памяти и уменьшитьвероятность утечек.

Возможно, вам также повезет, если использовать Mat::ptr<float>(n), чтобы получить float* в n -ую строку матрицы, но если вы не скопируете данные, яЯ не уверен, что у вас есть гарантии относительно того, как долго этот указатель будет оставаться действительным.

1 голос
/ 17 октября 2011

Если вы имеете в виду это,

float a[M][N]; //M and N are compile-time constants!
float **p = a; //error

тогда вы не можете этого сделать.

Однако вы можете сделать это:

float (*p)[N] = a; //ok

Но если это вам не поможет, и вы хотите float** любой ценой, то используйте два цикла for и сделайте это вручную, копируя каждый элемент из a в p:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...