#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
: