Преобразовать Mat в **float

#c #opencv #matrix

#c #opencv #матрица

Вопрос:

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

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

Ответ №1:

Беглый взгляд на документацию для Mat класса не показывает какого-либо очевидного оператора «преобразовать в 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 -ю строку матрицы, но если вы не скопируете данные, я не уверен, какие гарантии у вас будут относительно того, как долго этот указатель будет оставаться действительным.

Ответ №2:

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

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

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

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

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

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