【问题标题】:OpenCV Mat move data to custom structureOpenCV Mat 将数据移动到自定义结构
【发布时间】:2021-10-01 03:01:13
【问题描述】:

我有 cv::Mat 和保存数据的自定义结构。像这样将数据从cv::Mat 传递到我的结构是否安全?

struct MyStruct {
   uint8_t* data;
}

MyStruct foo(){
   MyStruct s;

   cv::Mat m = cv::imread("test.png", 0);
   s.data = m.data;
   m.data = nullptr;

   return s;
}

基本上,我需要 OpenCV 不破坏分配的 cv::Mat 数据。我也不想创建副本,因为数据可能很大。

或者还有其他方法吗?

【问题讨论】:

    标签: c++ opencv opencv-mat


    【解决方案1】:
    cv::Mat a,b;
    ...
    b=a;
    

    不会做数据的新副本。它只会复制标题并增加智能指针计数器。

    要应用深拷贝,您需要做:

    b=a.clone();
    

    其他数据将在 a 和 b 之间共享。

    如果您想使用自定义存储,最好明确分配和复制
    然后允许 opencv 免费分配 Mat,否则您可能会破坏应用程序中的内存管理。

    您也可以尝试使用预分配数组创建矩阵:

    float my_data[100][100];
    cv::Mat A(100, 100, CV_32F, my_data);
    

    但不确定这种情况下的内存管理,现在不能尝试。

    【讨论】:

    • 是的,但我需要从cv::Mat 中获取原始数据,并将它们分配给我自己的结构,而不需要复制,并且数据不会被opencv 破坏。我正在寻找 OpenCV 矩阵的自定义内存分配器,但它相当复杂。
    • 更新了我的答案。
    • 传递预分配内存的问题是我不知道imread结果的大小。
    • 您可以尝试手动增加 MyMat.u.refcount 并且不应释放矩阵数据。但需要手动管理,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多