[英]How should I pass a pointer-to-member-function to setMouseCallback in 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 );
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 );
您應該將onMouse
靜態,然后將其命名為: &CameraHeight::onMouse
。
@Remy Lebeau謝謝您的回答是正確的,它對我有很大幫助。但是之后,我得到一個錯誤,即靜態成員函數無法調用同一類的成員變量! 但是我可以這樣解決:
void CameraHeight::onMouse( int event, int x, int y, int flags, void* param ) {
CameraHeight *anInstance = static_cast<CameraHeight *>(param);
}
並訪問CameraHeight::onMouse
(例如int aa;
)中的CameraHeight實例成員:
anInstance->aa;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.