c++ opencv visual-studio-2012 opencv3.0

c++ - ¿Cómo puedo obtener la posición y dibujar un rectángulo usando opencv?



visual-studio-2012 opencv3.0 (1)

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

Tengo un código simple del documento

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

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 falta 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

Error 6 error C3867: ''ProjectFinal :: MyForm :: CallBackFunc'': llamada a la función falta 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 tiene un problema no relacionado con su pregunta.

Sin embargo, puede lograr su objetivo utilizando solo las instalaciones de OpenCV highgui:

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