簡體   English   中英

如何在OpenCV中將指針指向成員函數傳遞給setMouseCallback?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM