繁体   English   中英

如何将 OpenCV cv::Mat 转换为 Void 指针?

[英]How to cast OpenCV cv::Mat as Void pointer?

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

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?

只需创建您自己的包装器:

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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM