簡體   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