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