Detect Mouse Clicks and Moves on Image Window

void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0)

This function sets a callback function to be called every time any mouse events occurs in the specified window. Here is the detailed explanation of the each parameters of the above OpenCV function.
    • winname - Name of the OpenCV window. All mouse events related to this window will be registered
    • onMouse - Name of the callback function. Whenever mouse events related to the above window occur, this callback function will be called. This function should have the signature like the following
      • void FunctionName(int event, int x, int y, int flags, void* userdata)
        • event - Type of the mouse event. These are the entire list of mouse events
          • EVENT_MOUSEMOVE
          • EVENT_LBUTTONDOWN
          • EVENT_RBUTTONDOWN
          • EVENT_MBUTTONDOWN
          • EVENT_LBUTTONUP
          • EVENT_RBUTTONUP
          • EVENT_MBUTTONUP
          • EVENT_LBUTTONDBLCLK
          • EVENT_RBUTTONDBLCLK
          • EVENT_MBUTTONDBLCLK
        • x - x coordinate of the mouse event
        • y - y coordinate of the mouse event
        • flags - Specific condition whenever a mouse event occurs. See the next OpenCV example code for the usage of this parameter. Here is the entire list of enum values which will be possesed by "flags"
          • EVENT_FLAG_LBUTTON
          • EVENT_FLAG_RBUTTON
          • EVENT_FLAG_MBUTTON
          • EVENT_FLAG_CTRLKEY
          • EVENT_FLAG_SHIFTKEY
          • EVENT_FLAG_ALTKEY
        • userdata - Any pointer passes to the "setMouseCallback" function as the 3rd parameter (see below)
    • userdata - This pointer will be passed to the callback function
This program takes care of mouse button press and mouse movements.

This may be helpful while you want to select a region on an image and perform certain task in that region only.

Example:

-----------
#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()
{
    // Read image from file 
    Mat img = imread("lena.JPG");

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

    //Create a window
    namedWindow("ImageDisplay", 1);

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

    //show the image
    imshow("ImageDisplay", img);

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

    return 0;

}
-----------

Example 2:

This code will detect left mouse clicks while pressing the "CTRL" key , right mouse clicks while pressing the "SHIFT" key and movements of the mouse over the OpenCV window while pressing the "ALT" key.
------------
#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 ( flags == (EVENT_FLAG_CTRLKEY + EVENT_FLAG_LBUTTON) )
    {
        cout << "Left mouse button is clicked while pressing CTRL key - position (" << x << ", " << y << ")" << endl;
    }
    else if ( flags == (EVENT_FLAG_RBUTTON + EVENT_FLAG_SHIFTKEY) )
    {
        cout << "Right mouse button is clicked while pressing SHIFT key - position (" << x << ", " << y << ")" << endl;
    }
    else if ( event == EVENT_MOUSEMOVE && flags == EVENT_FLAG_ALTKEY)
    {
        cout << "Mouse is moved over the window while pressing ALT key - position (" << x << ", " << y << ")" << endl;
    }
}

int main(int argc, char** argv)
{
    // Read image from file 
    Mat img = imread("lena.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;
}
------------

Example 3: 

This code will extract color information at a pixel location in an image.
------------
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

void mouseEvent(int evt, int x, int y, int flags, void* param) 
{                    
    Mat* rgb = (Mat*) param;
    if (evt == CV_EVENT_LBUTTONDOWN) 
    { 
        printf("%d %d: %d, %d, %d\n", 
        x, y, 
        (int)(*rgb).at<Vec3b>(y, x)[0], 
        (int)(*rgb).at<Vec3b>(y, x)[1], 
        (int)(*rgb).at<Vec3b>(y, x)[2]); 
    }         
}

int main(int argc, char** argv)
{
    // Read image from file
    Mat img = imread("lena.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", mouseEvent, &img);

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

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

    return 0;
} 
------------

Example 4:

------------
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

void on_mouse( int e, int x, int y, int d, void *ptr )
{
    Point*p = (Point*)ptr;
    p->x = x;
    p->y = y;
    cout<<*p;
}

int main(int argc, char** argv)
{
    // Read image from file
    Mat img = imread("lena.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
    Point p;
    setMouseCallback("My Window", on_mouse, &p );

    //show the image
    imshow("My Window", img);
    
    // Wait until user press some key
    waitKey(0);
    return 0;
}
------------
Sources:
http://opencv-srf.blogspot.in/2011/11/mouse-events.html
http://stackoverflow.com/questions/14874449/opencv-set-mouse-callback
http://stackoverflow.com/questions/15570431/opencv-return-value-from-mouse-callback-function

13 comments:

  1. What kind of user data can I pass to my mouse call back?

    ReplyDelete
    Replies
    1. You can pass pointers of any data type to the callBackFun.

      For example, you can pass pointers to Mat, or Point. You can get a hint from example 3 and 4.

      Delete
  2. If i want to return value x, y to main. How could i do ?

    Sorry but i just a newbie on opencv

    ReplyDelete
    Replies
    1. See example 4. It will return the mouse coordinates to main function as pointer.

      Delete
  3. HI, thank you very much for your codes, I just have one question, why do you put first the y and then the x in these instructions:
    (int)(*rgb).at(y, x)[0],
    (int)(*rgb).at(y, x)[1],
    (int)(*rgb).at(y, x)[2]);
    Is it the right order?

    ReplyDelete
    Replies
    1. Image axis convention: x->columns, y->rows

      Delete
  4. How can I blur faces by drawing a rectangle on them by opencv (c++) ?

    Thanks

    ReplyDelete
  5. I tried to use the example 4, but I still cant access the x and y in main. How can I do it?

    ReplyDelete
  6. in example 4,what's the meaning of "Point*p = (Point*)ptr;"?

    ReplyDelete
  7. Thanks a lot man! You saved my day!

    ReplyDelete
  8. Trung tâm dạy kế toán thực hành Tại cầu giấy
    Trung tâm dạy kế toán thực hành Tại từ liêm
    Trung tâm dạy kế toán thực hành Tại thanh xuân
    Trung tâm dạy kế toán thực hành Tại hà đông
    Trung tâm dạy kế toán thực hành Tại long biên
    Trung tâm dạy kế toán thực hành Tại nguyễn chính thanh đống đa
    Trung tâm dạy kế toán thực hành Tại minh khai hai bà trưng
    Trung tâm dạy kế toán thực hành Tại bắc ninh
    Trung tâm dạy kế toán thực hành Tại hải phòng
    Trung tâm dạy kế toán thực hành Tại tphcm
    Trung tâm dạy kế toán thực hành Tại quận 3
    Trung tâm dạy kế toán thực hành Tại thủ đức
    Trung tâm dạy kế toán thực hành Tại đà nẵng
    Trung tâm dạy kế toán thực hành Tại biên hòa
    Trung tâm dạy kế toán thực hành Tại đồng nai
    Trung tâm dạy kế toán thực hành Tại nam định
    Trung tâm dạy kế toán thực hành Tại thái bình
    Trung tâm dạy kế toán thực hành Tại bắc giang
    Trung tâm dạy kế toán thực hành Tại vĩnh phúc
    Trung tâm dạy kế toán thực hành Tại thái nguyên
    Trung tâm dạy kế toán thực hành Tại quảng ninh
    Trung tâm dạy kế toán thực hành Tại hải dương
    Trung tâm dạy kế toán thực hành Tại hưng yên
    Trung tâm dạy kế toán thực hành Tại hà nam
    Trung tâm dạy kế toán thực hành Tại ninh bình
    Trung tâm dạy kế toán thực hành Tại nghệ an
    Trung tâm dạy kế toán thực hành Tại vũng tàu

    ReplyDelete