我应该如何在OpenCV中将指向成员函数的指针传递给setMouseCallback?

时间:2016-06-13 15:15:42

标签: c++ opencv

如何在setMouseCallback中的类中调用OnMouse?

通常就是这样:

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

这是我的计划:

Camera_Height.h:

class CameraHeight
{

public:
  void onMouse( int, int, int, int, void*);
};

Camera_Height.cpp:

void CameraHeight::onMouse( int event, int x, int y, int, void* )
{
   //processing
}

main.cpp中:

如何在setMouseCallback中使用onMouse

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

3 个答案:

答案 0 :(得分:3)

setMouseCallback()不接受回调的指向成员函数的指针,它需要一个独立的函数。因此,如果要使用类方法,则必须将其声明为static以删除其this指针。

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

  

SetMouseCallback

     

为指定窗口设置鼠标处理程序

     

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

     

C:void cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param=NULL )

     

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

     

参数:
   - winname - 窗口名称
   - onMouse - 鼠标回调。有关如何指定和使用回调的信息,请参阅OpenCV示例,例如https://github.com/Itseez/opencv/tree/master/samples/cpp/ffilldemo.cpp    - userdata - 传递给回调的可选参数。

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

Camera_Height.h:

class CameraHeight
{
public:
  static void onMouse( int evt, int x, int y, int flags, void* param );
};

Camera_Height.cpp:

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 );

我建议在setMouseCallback类中移动CameraHeight,其构造函数设置回调,其析构函数清除回调:

Camera_Height.h:

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();
};

Camera_Height.cpp:

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( String );

答案 1 :(得分:0)

您应该onMouse静态,然后调用它:&CameraHeight::onMouse

答案 2 :(得分:0)

@Remy Lebeau 谢谢你的答案是对的,它对我帮助很大.. 但之后我得到一个错误,静态成员函数不能调用同一个类的成员变量! 但我这样解决了:

CameraHeight::onMouse

并访问int aa;内的CameraHeight实例成员(ex anInstance->aa; ):

CentOS Linux release 7.1.1503 (Core)

NAME="CentOS Linux"

VERSION="7 (Core)"

ID="centos"

ID_LIKE="rhel fedora"

VERSION_ID="7"

PRETTY_NAME="CentOS Linux 7 (Core)"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:centos:centos:7"

HOME_URL="https://www.centos.org/"

BUG_REPORT_URL="https://bugs.centos.org/"


CENTOS_MANTISBT_PROJECT="CentOS-7"

CENTOS_MANTISBT_PROJECT_VERSION="7"

REDHAT_SUPPORT_PRODUCT="centos"

REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.1.1503 (Core)
CentOS Linux release 7.1.1503 (Core)

**PHP Version:** 5.4.16 

**HTTPD Version:** 2.4.6

**MariaDB Version:** 15.1 Distrib 5.5.41-MariaDB, for Linux (x86_64) using readline 5.1



**SELinux Status:**

SELinux status:                 enabled

SELinuxfs mount:                /sys/fs/selinux

SELinux root directory:         /etc/selinux

Loaded policy name:             targeted

Current mode:                   enforcing

Mode from config file:          enforcing

Policy MLS status:              enabled

Policy deny_unknown status:     allowed