[英]How to cast OpenCV cv::Mat as Void pointer?
I am using a 3rd party SDK in my project which accepts void *
pointer for setting user specific metadata.我在我的项目中使用第三方 SDK ,它接受
void *
指针来设置用户特定的元数据。 But my metadata is in cv::Mat
format thus I need to cast the cv::Mat
as void *
pointer as shown here:但是我的元数据是
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);
}
This works good, but many of the OpenCV power users discourage using pointers with cv::Mat as cv::Mat has smart pointer itself.这很好用,但许多OpenCV高级用户不鼓励将指针与 cv::Mat 一起使用,因为 cv::Mat 本身具有智能指针。 I wonder is there any better way to cast the cv::Mat as void-pointer in my case?
我想知道在我的案例中是否有更好的方法将 cv::Mat 转换为 void-pointer?
Simply create your own wrapper:只需创建您自己的包装器:
class MyWrapper {
public:
cv::Mat frame;
};
Allocate as you normally would:像往常一样分配:
MyWrapper *ptr = new MyWrapper();
ptr->frame = myOtherFrame;
Then pass where you need, like:然后通过你需要的地方,比如:
user_meta->user_meta_data = (void *) ptr;
Note that your approach (mentioned in question) is doing a full copy, but above just keeps a reference to an existing smart-pointer.
请注意,您的方法(有问题)正在执行完整复制,但上面只是保留对现有智能指针的引用。
We could shorten the usage, into:我们可以将用法缩短为:
user_meta->user_meta_data = (void *) new MyWrapper( frame );
If we had a constructor, like:如果我们有一个构造函数,例如:
class MyWrapper {
public:
explicit MyWrapper(cv::Mat &frame)
: frame(frame)
{}
public:
cv::Mat frame;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.