-3

我在我的项目中使用第 3 方 SDK,它接受void *用于设置用户特定元数据的指针。但是我的元数据是cv::Mat格式的,因此我需要转换cv::Matasvoid *指针,如下所示:

void *set_metadata_ptr(cv::Mat frame)
{

  cv::Mat *user_metadata = new cv::Mat();

  frame.copyTo(*user_metadata);

  return (void *)user_metadata;
}

void foo() 
{
  UserMeta *user_meta = /* ... */;
  user_meta->user_meta_data = (void *)set_metadata_ptr(frame);
}

这很好用,但许多OpenCV高级用户不鼓励使用带有 cv::Mat 的指针,因为 cv::Mat 本身具有智能指针。我想知道在我的情况下是否有更好的方法将 cv::Mat 转换为 void-pointer?

4

1 回答 1

-2

只需创建自己的包装器:

class MyWrapper {
public:
    cv::Mat frame;
};

像往常一样分配:

MyWrapper *ptr = new MyWrapper();
ptr->frame = myOtherFrame;

然后通过你需要的地方,比如:

user_meta->user_meta_data = (void *) ptr;

请注意,您的方法(有问题提到)正在做一个完整的副本,但上面只是保留对现有智能指针的引用。

一个班轮版本:

我们可以将用法缩短为:

user_meta->user_meta_data = (void *) new MyWrapper( frame );

如果我们有一个构造函数,比如:

class MyWrapper {
public:
    explicit MyWrapper(cv::Mat &frame)
        : frame(frame)
    {}

public:
    cv::Mat frame;
};
于 2021-10-03T15:00:46.567 回答