[英]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.