2015-07-12 51 views
0

我想在移動並在圖片框中單擊鼠標時獲得一個位置。 我想在圖像窗口中單擊鼠標的時間和位置創建矩形。如何獲得位置並使用opencv繪製矩形?

我有一個簡單的代碼文件

#include "stdafx.h" 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 

using namespace std; 
using namespace cv; 

void CallBackFunc(int event, int x, int y, int flags, void* userdata) 
{ 
    if (event == EVENT_LBUTTONDOWN) 
    { 
     cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;  
    } 
    else if(event == EVENT_RBUTTONDOWN) 
    { 
     cout << "Right button of the mouse is clicked - position (" << x << ", " << y << ")" << endl; 
    } 
    else if(event == EVENT_MBUTTONDOWN) 
    { 
     cout << "Middle button of the mouse is clicked - position (" << x << ", " << y << ")" << endl; 
    } 
    else if (event == EVENT_MOUSEMOVE) 
    { 
     cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl; 
    } 
} 

int main(int argc, char** argv) 
{ 
    bool isDragging = false; 

    // Read image from file 
    Mat img = imread("input/pic1.jpg"); 

    //if fail to read the image 
    if(img.empty()) 
    { 
     cout << "Error loading the image" << endl; 
     return -1; 
    } 

    //Create a window 
    namedWindow("My Window", 1); 

    //set the callback function for any mouse event 
    setMouseCallback("My Window", CallBackFunc, NULL); 

    //show the image 
    imshow("My Window", img); 

    // Wait until user press some key 
    waitKey(0); 

    return 0; 
} 

它在Windows上工作形成=,但我想用鼠標點擊。我把代碼放在GUI上。它引發以下錯誤:

Error 3 error C3867: 'ProjectFinal::MyForm::CallBackFunc': function call missing argument list; use '&ProjectFinal::MyForm::CallBackFunc' to create a pointer to member c:\users\nungningz\documents\visual studio 2012\projects\projectfinal\projectfinal\MyForm.h 690 1 ProjectFinal

Error 6 error C3867: 'ProjectFinal::MyForm::CallBackFunc': function call missing argument list; use '&ProjectFinal::MyForm::CallBackFunc' to create a pointer to member c:\users\nungningz\documents\visual studio 2012\projects\projectfinal\projectfinal\MyForm.h 690 1 ProjectFinal

7 IntelliSense: a pointer-to-member is not valid for a managed class c:\Users\NungNingZ\Documents\Visual Studio 2012\Projects\ProjectFinal\ProjectFinal\MyForm.h 690 37 ProjectFinal

+3

您的代碼工作正常,我。它看起來像您發佈的代碼與您發佈的錯誤不匹配。您發佈的代碼編譯並運行良好。請發佈顯示這些錯誤的實際代碼。 – Ove

+0

主題中的代碼對我來說也不錯,但在windowsForms上很好。通常我會在使用前測試並開發一個帶有windowsForm的簡單代碼。當我與Gui一起在項目中應用代碼時,他們有問題。必須在setMouseCallback(「My Window」,CallBackFunc,NULL)中推送一個參數;我無法解決問題。幫助我plz – Nungning

回答

2

所以你無關你的問題的問題。

但是,你可以只使用OpenCV的highgui facilites實現自己的目標:

#include <opencv2\opencv.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

vector<Rect> rects; 
bool bDraw; 
Rect r; 
Point base; 

Mat3b img; 
Mat3b layer; 
Mat3b working; 


void CallBackFunc(int event, int x, int y, int flags, void* userdata) 
{ 
    if (event == EVENT_LBUTTONDOWN) 
    { 
     cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;  

     // Init your rect 
     base.x = x; 
     base.y = y; 
     r.x = x; 
     r.y = y; 
     r.width = 0; 
     r.height = 0; 
     bDraw = true; 
    }   
    else if (event == EVENT_MOUSEMOVE) 
    { 
     cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl; 

     // If drawing, update rect width and height 
     if(!bDraw) return; 

     int dx = abs(r.x - x); 
     int dy = abs(r.y - y); 

     if(x < base.x) { 
      r.x = x; 
      r.width = abs(x - base.x); 
     } else { 
      r.width = dx; 
     } 

     if(y < base.y) { 
      r.y = y; 
      r.height = abs(y - base.y); 
     } else { 
      r.height = dy; 
     } 

     // Refresh 
     working = layer.clone(); 
     rectangle(working, r, Scalar(0,255,0)); 
     imshow("My Window", working); 
    } 
    else if (event == EVENT_LBUTTONUP) 
    { 
     cout << "Left button released" << endl; 

     // Save rect, draw it on layer 
     rects.push_back(r); 
     rectangle(layer, r, Scalar(0,255,255)); 

     r = Rect(); 
     bDraw = false; 

     // Refresh 
     working = layer.clone(); 
     rectangle(working, r, Scalar(0,255,0)); 
     imshow("My Window", working); 
    } 
} 

int main(int argc, char** argv) 
{ 
    bool bDraw = false; 
    bool isDragging = false; 

    // Read image from file 
    img = imread("path_to_image"); 

    // initialize your temp images 
    layer = img.clone(); 
    working = img.clone(); 

    //if fail to read the image 
    if(img.empty()) 
    { 
     cout << "Error loading the image" << endl; 
     return -1; 
    } 

    //Create a window 
    namedWindow("My Window", 1); 

    //set the callback function for any mouse event 
    setMouseCallback("My Window", CallBackFunc, NULL); 

    //show the image 
    imshow("My Window", working); 

    // Wait until user presses 'q' 
    while((waitKey(1) & 0xFF) != 'q'); 

    return 0; 
} 
+0

謝謝你的高級.it代碼工作在簡單的Windows窗體上查找,但在gui中推它並不好,並有錯誤 – Nungning

+0

這回答你的問題,這不是關於窗體。您可能遇到了特定於您正在使用的GUI的問題,並且您可能會更好地詢問一個新的問題(此次使用實際的代碼) – Miki