如何在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 );
答案 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