¿Cómo puedo obtener la posición y dibujar el rectángulo usando opencv?

Quiero obtener una posición cuando mueva y haga clic en el mouse en cuadro de imagen. Quiero crear un rectángulo en la ventana de la imagen cuando y donde se hace clic en el mouse.

Tengo un código simple del documento

#include "stdafx.h" #include "opencv2/highgui/highgui.hpp" #include  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; } 

Funciona en Windows form =, pero quiero usar clics del mouse. Puse el código en la GUI. Lanza el siguiente error:

Error 3 error C3867: ‘ProjectFinal :: MyForm :: CallBackFunc’: llamada a la función lista de argumentos faltantes; use ‘& ProjectFinal :: MyForm :: CallBackFunc’ para crear un puntero al miembro c: \ users \ nungningz \ documents \ visual studio 2012 \ projects \ projectfinal \ projectfinal \ MyForm.h 690 1 ProjectFinal

Error 6 error C3867: ‘ProjectFinal :: MyForm :: CallBackFunc’: llamada a la función que falta la lista de argumentos; use ‘& ProjectFinal :: MyForm :: CallBackFunc’ para crear un puntero al miembro c: \ users \ nungningz \ documents \ visual studio 2012 \ projects \ projectfinal \ projectfinal \ MyForm.h 690 1 ProjectFinal

7 IntelliSense: un puntero a miembro no es válido para una clase administrada c: \ Users \ NungNingZ \ Documents \ Visual Studio 2012 \ Projects \ ProjectFinal \ ProjectFinal \ MyForm.h 690 37 ProjectFinal

Entonces tienes un problema no relacionado con tu pregunta.

Sin embargo, puedes lograr tu objective usando solo las herramientas Opengu Highgui:

 #include  #include  using namespace std; using namespace cv; vector 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; rx = x; ry = 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(rx - x); int dy = abs(ry - y); if(x < base.x) { rx = x; r.width = abs(x - base.x); } else { r.width = dx; } if(y < base.y) { ry = 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; }