OpenCV从堆中的数组创建Mat
OpenCV create Mat from Array in heap
当我尝试使用堆上分配的数组初始化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.
相关文章:
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为