Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OpenCV中将指向成员函数的指针传递给setMouseCallback?_C++_Opencv - Fatal编程技术网

C++ 如何在OpenCV中将指向成员函数的指针传递给setMouseCallback?

C++ 如何在OpenCV中将指向成员函数的指针传递给setMouseCallback?,c++,opencv,C++,Opencv,如何在setMouseCallback中的类中定义调用OnMouse 通常是这样的: cv::setMouseCallback( String, onMouse, 0 ); 这是我的节目: 摄像机高度。h: class CameraHeight { public: void onMouse( int, int, int, int, void*); }; void CameraHeight::onMouse( int event, int x, int y, int, void* ) {

如何在setMouseCallback中的类中定义调用OnMouse

通常是这样的:

cv::setMouseCallback( String, onMouse, 0 );
这是我的节目:

摄像机高度。h:

class CameraHeight
{

public:
  void onMouse( int, int, int, int, void*);
};
void CameraHeight::onMouse( int event, int x, int y, int, void* )
{
   //processing
}
摄像机高度。cpp:

class CameraHeight
{

public:
  void onMouse( int, int, int, int, void*);
};
void CameraHeight::onMouse( int event, int x, int y, int, void* )
{
   //processing
}
main.cpp:

class CameraHeight
{

public:
  void onMouse( int, int, int, int, void*);
};
void CameraHeight::onMouse( int event, int x, int y, int, void* )
{
   //processing
}
如何在setMouseCallback中使用onMouse

CameraHeight camh1;
cv::setMouseCallback( String, onMouse, 0 );

您应该将
onMouse
设为静态,然后调用它:
&CameraHeight::onMouse
setMouseCallback()
不接受回调函数指向成员函数的指针,它需要一个独立函数。因此,如果要使用类方法,必须将其声明为
静态
,以删除其
指针

要访问类的实例成员,回调需要指向类实例的指针。的最后一个参数是传递给回调的用户提供的指针:

SetMouseCallback

CameraHeight camh1;
cv::setMouseCallback( String, onMouse, 0 );
设置指定窗口的鼠标处理程序

C++:
void setMouseCallback(const string&winname,mouse上的MouseCallback,void*userdata=0)

C:
void cvSetMouseCallback(const char*window\u name,鼠标上的CvMouseCallback,void*param=NULL)

Python:
cv.SetMouseCallback(windowName,onMouse,param=None)→ 无

参数:
-winname–窗口名称
-onMouse–鼠标回调。有关如何指定和使用回调,请参阅OpenCV示例,例如。
-userdata–传递给回调的可选参数。

您可以使用该参数将
camh1
对象传递给回调:

摄像机高度。h:

class CameraHeight
{
public:
  static void onMouse( int evt, int x, int y, int flags, void* param );
};
class CameraHeight
{
private:
   string m_winname;
   static void onMouse( int evt, int x, int y, int flags, void* param );
public:
  CameraHeight(const string &winname);
  ~CameraHeight();
};
摄像头高度.cpp:

void CameraHeight::onMouse( int evt, int x, int y, int flags, void* param )
{
   CameraHeight *pThis = (CameraHeight*) param; 
   // use pThis as needed...
}
CameraHeight::CameraHeight(const string &winname)
    : m_winname(winname)
{
    cv::setMouseCallback(m_winname, &CameraHeight::onMouse, this);
}

CameraHeight::~CameraHeight()
{
    cv::setMouseCallback(m_winname, NULL, 0);
}

void CameraHeight::onMouse( int evt, int x, int y, int flags, void* param )
{
   CameraHeight *pThis = (CameraHeight*) param; 
   // use pThis as needed...
}
main.cpp:

CameraHeight camh1;
cv::setMouseCallback( String, &CameraHeight::onMouse, &camh1 );
CameraHeight camh1( String );
我建议将
setMouseCallback
移动到
CameraHeight
类中,其构造函数设置回调,其析构函数清除回调:

摄像机高度。h:

class CameraHeight
{
public:
  static void onMouse( int evt, int x, int y, int flags, void* param );
};
class CameraHeight
{
private:
   string m_winname;
   static void onMouse( int evt, int x, int y, int flags, void* param );
public:
  CameraHeight(const string &winname);
  ~CameraHeight();
};
摄像头高度.cpp:

void CameraHeight::onMouse( int evt, int x, int y, int flags, void* param )
{
   CameraHeight *pThis = (CameraHeight*) param; 
   // use pThis as needed...
}
CameraHeight::CameraHeight(const string &winname)
    : m_winname(winname)
{
    cv::setMouseCallback(m_winname, &CameraHeight::onMouse, this);
}

CameraHeight::~CameraHeight()
{
    cv::setMouseCallback(m_winname, NULL, 0);
}

void CameraHeight::onMouse( int evt, int x, int y, int flags, void* param )
{
   CameraHeight *pThis = (CameraHeight*) param; 
   // use pThis as needed...
}
main.cpp:

CameraHeight camh1;
cv::setMouseCallback( String, &CameraHeight::onMouse, &camh1 );
CameraHeight camh1( String );
@雷米·勒博 谢谢你的回答是对的,这对我很有帮助。。 但是在那之后我得到一个错误,静态成员函数不能调用同一类的成员变量! 但我是这样解决的:

void CameraHeight::onMouse( int event, int x, int y, int flags, void* param ) { 
    CameraHeight *anInstance = static_cast<CameraHeight *>(param); 
  }

这可能会使情况变得更糟,而不是更好……这只有在函数不需要任何每个实例的数据,或者您将实例作为用户指针传递时才有用。无论哪种方式,它似乎都无法回答所述的问题。@下划线\d确实,如果需要对象数据,通常会传递对象指针。@LightnessRacesinOrbit,这取决于OP是否需要实例数据……这里的回调似乎没有提供用户数据指针。所以这似乎是不可能的。在这种情况下,您真的需要使用类实例吗?什么是摄像头高度?它有什么功能?您是否需要它的多个实例,每个实例都有自己的数据,并对每个实例的数据执行回调操作?如果没有,则不要使用实例;只需使用一个自由函数。(或者说是一个完全静态的类,但是让它成为一个类又有什么意义呢?@karlphillip这不是一个类!