首页 > 解决方案 > 在 OpenCV 的回调中使用 shared_ptr/cv::Ptr 作为用户数据

问题描述

我正在使用以下方法在 OpenCV 显示窗口内跟踪鼠标点击:

void on_buttonClick(int event, int x, int y, int flags, void* userdata) 
{
    // Callback function received
}

void main() {
    cv::setMouseCallback(win_name, on_buttonClick, (void*) fun_ptr);
}

最后一个参数fun_ptr作为user_data回调的一部分返回。只要我想对用户数据使用函数指针,这很好。

但现在我需要传递std::shared_ptr<CustomClass>相当于user_data. 我想传递 a 的原因shared_ptr是,只要刷新显示窗口的上下文,对象就会自动销毁。

我尝试使用两种机制:
- std::shared_ptr
- cv::Ptr (功能类似于 std::shared_ptr)

下面的示例代码:

class CustomClass {
    int x;
    int y;
}

int main() {
    cv::Ptr<CustomClass> x(new CustomClass());
    cv::setMouseCallback(win_name, on_buttonClick, (void*) x);
}

但是,一旦我将 shared_ptr 转换为 (void*),它就会失去它的用途。有没有办法在 OpenCV 中解决这个问题(afaik,使用典型的newdelete因为无法确定删除的时间,所以不好)。

标签: opencvc++11opencv3.0

解决方案


推荐阅读