OpenCV从堆中的数组创建Mat

OpenCV create Mat from Array in heap

本文关键字:数组 创建 Mat OpenCV      更新时间:2023-10-16

当我尝试使用堆上分配的数组初始化Mat对象时,我遇到了一个问题。

这是我的代码:

void test(){
    int rows = 2;
    int cols = 3;
    float **P_array;
    P_array = new float*[rows];
    int i;
    for(i = 0; i < rows; i++)
            P_array[i] = new float[cols];

    P_array[0][0]=1.0; P_array[0][1]=2.0; P_array[0][2]=3.0;
    P_array[1][0]=4.0; P_array[1][1]=5.0; P_array[1][2]=6.0;
    float P_array2[2][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};
    Mat P_m = Mat(rows, cols, CV_32FC1, &P_array);
    Mat P_m2 = Mat(2,3, CV_32FC1, &P_array2);
    cout << "P_m: "  << P_m   << endl;
    cout << "P_m2: " << P_m2 << endl;
}

结果如下:

P_m: [1.1737847e-33, 2.8025969e-45, 2.8025969e-45;
  4.2038954e-45, 1.1443695e-33, -2.2388967e-06]
P_m2: [1, 2, 3;
  4, 5, 6]

可以看到,动态分配的数组没有成功复制。然而,对我来说,能够从动态分配的数组中初始化是至关重要的。

我该怎么办?

谢谢你的帮助。

opencv Mat想要连续的内存,内部表示只是一个单一的uchar *。

  • 你的P_array是一个指针数组 -不是连续的
  • 你的P_array2 连续的(但静态的…)

如果你需要用动态内存初始化它,只需使用单个浮点指针:

float *data = new float[ rows * cols ];
data[ y * cols + x ] = 17; // etc.
Mat m(rows, cols, CV_32F, data);

还要注意,在完成mat之前,您的数据指针不会被删除/超出作用域。在这种情况下,您需要clone()它来实现深度复制:

Mat n = m.clone();
delete[] data; // safe now.