2013-01-11 28 views
3

我試圖用CV :: setMouseCallback在我的C++項目。我只是不明白。 讓那我HABE一類的東西怎麼能知道這個類,你得到了一個框架,在這裏該框架上運行CV :: setMouseCallback是什麼,我試圖做一個例如如何使用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 

真正的程序太大,在這裏把它的代碼,所以我試圖簡化問題

+1

郵報編譯器錯誤信息,請。 – user1284631

+0

@axeoth我做到了,我編輯了問題 – Engine

回答

2

您必須聲明鼠標處理程序的類中靜態。例如,我有一個dragger與成員mouser,我想要被調用。我宣佈一個幫手static void mouser,即投的無效*收到並調用成員:

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

... 
} 
1

首先,你需要創建在一個名爲窗口main功能。 namedWindow("image", 0);或類似的東西可以完成這項工作。

鼠標回調函數沒有關聯到frame可變的,但它被關聯到該窗口。在你的情況將是:

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

的回調是調用其他函數在事件窗口上發生的功能。對於鼠標,事件可以是鼠標移動,左鍵,右鍵或中鍵。 Here你可以找到它們的列表,以及很好的解釋。

所以當這個「事件」發生在窗口中時,opencv調用名稱在setMouseCallback中指定的函數作爲參數,在你的情況下爲Stuff::mouse。如果這樣定義的函數:

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

當它被稱爲事件變量將被填充有觸發器的值,x和y與圖像等 如果在關閉鼠標的位置如果您考慮糾正patxiska的答案,則希望在您使用鼠標功能時將該框架傳遞給this問題。因此,與開關

你可以找出什麼樣的事件是:

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

    case CV_EVENT_RBUTTONDOWN: 
     //... 
     break; 

    case CV_EVENT_FLAG_CTRLKEY: 
     //... 
     break; 
} 

,並採取你的幀從void*類型轉換回一個cv::Mat

Here你可以找到關於如何使用鼠標回調opencv的站點的另一個例子。

希望我幫助,我沒有使用OpenCV進行了一段時間,我現在沒有我的示例源文件。回調在Opencv GUI中得到簡化,但這是與任何GUI一起工作的邏輯。諸如鼠標和鍵盤觸發事件之類的輸入以及回調函數將事件傳遞給您實現的功能。

+0

非常感謝您的幫助,但這並不能解決我的問題,請參閱編輯我的問題,我剛剛添加了編譯器錯誤 – Engine