将Mat转换为**float

Convert Mat to **float

本文关键字:float 转换 Mat      更新时间:2023-10-16

我有一个OpenCV函数,返回类型是Mat。我如何将其转换为二维浮点数组(** float)?

可能很简单,但是我自己做不到

快速查看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::vectorboost::multi_array来避免尴尬的内存分配/释放并减少泄漏的可能性。

你可能也有一些运气使用Mat::ptr<float>(n)获得float*到矩阵的n行,但如果你不复制数据,我不确定什么保证你会有多长时间的指针将保持有效。

如果你是这个意思,

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

则不能这样做。

但是,你可以这样做:

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

但如果这对你没有帮助,你想要float**不惜任何代价,然后使用两个for循环,并手动执行,将每个元素从a复制到p: