簡體   English   中英

如何使用cv :: setMouseCallback

[英]how to use cv::setMouseCallback

我正在嘗試在我的c ++項目中使用cv :: setMouseCallback。 我只是不明白。 讓我有一個類Stuff怎么能告訴這個類你有一個框架並在這個框架上運行cv :: setMouseCallback這是我正在嘗試做的一個例子

 class Stuff{
 public: 
Stuff();
void setFrame(cv::Mat); 
void mouse (int,int, int, int,void*);
  private :
cv::Mat frame;
int key;
 };

 Stuff::Stuff(){}

 void Stuff::setFrame(cv::Mat framex){
frame = framex;
 }


  int main (){
Stuff  obj;

cv::Mat frame = cv::imread ("examople.jpg");
char* name;
cv::imshow(name,frame);
cv::setMouseCallback(name,obj.mouse,&frame) // I' stop here because that's exactlly what just don't work 
    }

這個得到的錯誤信息:

   Stuff::mouse : function call missing argument list; use '&Stuff::mouse ' to create a pointer to member 

真正的程序太大了,不能把它的代碼放在這里,為什么我試圖簡化這個問題

你必須在你的類中聲明一個鼠標處理程序為靜態。 舉例來說,我有一個dragger與成員mouser ,我想叫。 我聲明了一個幫助器static void mouser ,它會轉換收到的void *並調用該成員:

class dragger {

void mouser(int event, int x, int y) {
  current_img = original_img.clone();
  Point P(x, y);
  ...
}
static void mouser(int event, int x, int y, int, void* this_) {
  static_cast<dragger*>(this_)->mouser(event, x, y);
}

以這種方式在dragger構造函數中實例化

dragger(string w, Mat m) :
    window_id(w), status(0), original_img(m), /*black(0, 0, 0),*/ K(5, 5)
{
   ...
   setMouseCallback(w, mouser, this);
}

...
}

首先,您需要在main函數中創建一個命名窗口。 namedWindow( "image", 0 ); 或類似的東西將完成這項工作。

鼠標回調函數與frame變量無關,但與窗口關聯。 在你的情況下,它將是:

char* name = "image";
cv::namedWindow( name, 0 );
cv::setMousCallback(name, obj.mouse,&frame);

回調函數是在窗口上發生事件時調用其他函數的函數。 對於鼠標,事件可以是鼠標移動,左,右或中間點擊。 在這里您可以找到它們的列表,以及很好的解釋。

所以當這個“事件”發生在窗口中時,opencv會調用名稱在setMouseCallback中指定的setMouseCallback作為參數,在你的案例中是Stuff::mouse 如果您定義這樣的函數:

Stuff::mouse( int event, int x, int y, int flags, void* params )

當它被調用時,事件變量將被填充觸發器的值,x和y以及鼠標在圖像上的位置等。如果你想在鼠標功能中傳遞幀,你可以像在這個問題中一樣使用它,如果你考慮修正patxiska的答案。

因此,通過開關,您可以找到它是什么類型的事件:

switch( event ){
    case CV_EVENT_LBUTTONDOWN:
        //...
        break;

    case CV_EVENT_RBUTTONDOWN:
        //...
        break;

    case CV_EVENT_FLAG_CTRLKEY:
        //...
        break;
}

並將你的框架從void*轉換回cv::Mat

在這里,您可以找到Opencv網站關於如何使用鼠標回調的另一個示例。

希望我幫忙,我暫時沒有使用opencv,現在我沒有我的示例源文件。 在Opencv GUI中簡化了回調,但這是使用任何GUI的邏輯。 鼠標和鍵盤觸發事件以及回調函數等輸入將事件傳遞給實現的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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