Top Ad unit 728 × 90

Recientes

recent

Curso OpenCV y C++ con Visual Studio 2013 (6-25) - Seleccionar y Recortar una imagen con el Mouse en OpenCv

Buen día amigos de IncanatoIT, en este artículo se explica la utilización de los eventos de ratón para la interacción con OpenCV.

Capturar eventos del raton:

void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse );

window_name: Nombre de la ventana de la que queremos capturar los eventos del ratón.

on_mouse: Nombre de la función que queremos que llame al ocurrir un evento del ratón. 

La función on_mouse que definamos tiene que tener la siguiente estructura: 

void on_mouse(int event, int x, int y, int flags) donde: 
- x e y son la posición en coordenadas de la imagen donde ha ocurrido el evento.
- event puede tomar cualquiera de los siguientes valores: 
  • #define CV_EVENT_MOUSEMOVE 0 
  • #define CV_EVENT_LBUTTONDOWN 1 
  • #define CV_EVENT_RBUTTONDOWN 2 
  • #define CV_EVENT_MBUTTONDOWN 3
  • #define CV_EVENT_LBUTTONUP 4 
  • #define CV_EVENT_RBUTTONUP 5 
  • #define CV_EVENT_MBUTTONUP 6 
  • #define CV_EVENT_LBUTTONDBLCLK 7 
  • #define CV_EVENT_RBUTTONDBLCLK 8 
  • #define CV_EVENT_MBUTTONDBLCLK 9
- y flags puede tomar los siguientes valores: 
  • #define CV_EVENT_FLAG_LBUTTON 1 
  • #define CV_EVENT_FLAG_RBUTTON 2 
  • #define CV_EVENT_FLAG_MBUTTON 4 
  • #define CV_EVENT_FLAG_CTRLKEY 8 
  • #define CV_EVENT_FLAG_SHIFTKEY 16 
  • #define CV_EVENT_FLAG_ALTKEY 32
Seleccionar y Recortar una Imagen con el Mouse
Utilizaremos el Mouse para seleccionar una región de la imagen mostrada en la ventana, automáticamente esa imagen debe de quedar recortada para eso tomaremos las coordenadas obtenidas al momento de seleccionar con el Mouse.

Mediante el evento de presión del botón izquierdo del mouse obtendremos la esquina superior Izquierda del rectángulo, y cuando este sea soltado obtendremos la esquina inferior derecha del rectángulo, guardaremos las coordenadas para luego calcular el rectángulo de recorte, y por ultimo mostramos la nueva imagen en la ventana.


Código: Ejemplo de Seleccionar y Recortar una Imagen con el Mouse en OpenCv y C++

// CursoOpenCV2410.cpp: Juan Carlos Arcila Díaz.

#include "stdafx.h"
#include "opencv2\opencv.hpp"

//Declaramos las Variables
//que indicarán si se presionó algún botón del mouse
bool ldown = false, lup = false;

//Declaramos la imagen
cv::Mat img;
//Declaramos los puntos del rectángulo
cv::Point esquina1, esquina2;
cv::Rect caja;
//Continúa...

static void mouse_callback(int event, int x, int y,int,void *)
{
      //Guardamos la primera coordenada cuando hacemos click con el botón izquierdo (Ldown) sobre la imagen
      if (event == CV_EVENT_LBUTTONDOWN)
      {
            ldown = true;
            esquina1.x = x;
            esquina1.y = y;
      }
      //Al soltar el botón izquierdo del Mouse (Lup), guardamos la segunda coordenada
      if (event == CV_EVENT_LBUTTONUP)
      {
            lup = true;
            esquina2.x = x;
            esquina2.y = y;
      }

      //Actualizamos la región Seleccionada
      if (ldown == true && lup == false)
      {
            cv::Mat local_img = img.clone();
            cv::rectangle(local_img,esquina1,cv::Point(x,y),cv::Scalar(0,255,0));
            cv::imshow("Recortando", local_img);
      }
      //Definir la región seleccionada con el Mouse
      //y Mostrarla en una ventana
      if (ldown==true && lup==true)
      {
            caja.width = abs(esquina1.x - esquina2.x);
            caja.height = abs(esquina1.y - esquina2.y);
            caja.x = cv::min(esquina1.x,esquina2.x);
            caja.y = cv::min(esquina1.y,esquina2.y);
            //Recortamos la imagen según el rectángulo de selección
            cv::Mat crop(img, caja);
            //Mostramos la imagen seleccionada
            cv::imshow("Imagen Seleccionada", crop);
            //Después de recortar dejamos false las variables
            ldown = false;
            lup = false;
      }
}

int _tmain(int argc, _TCHAR* argv[])
{
      //Leemos la imagen de disco
      img = cv::imread("D:\\pruebaopencv\\familia.jpg");
      //Mostramos la imagen Original
      cv::imshow("Imagen Original",img);
      //Capturamos el evento del ratón
      cvSetMouseCallback("Imagen Original", mouse_callback);
      //Mostramos mientras no se presone "ESC"
      while (char(cv::waitKey(30)) != 27) {}

      return 0;
}


Saludos Imperio, un abrazo a la distancia!
Curso OpenCV y C++ con Visual Studio 2013 (6-25) - Seleccionar y Recortar una imagen con el Mouse en OpenCv Reviewed by Juan Carlos Arcila Díaz on 11:37 Rating: 5

No hay comentarios:

All Rights Reserved by www.IncanatoIT.com - Desarrollando Software © 2014 - 2015
Powered By Blogger, Designed by Sweetheme

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

IncanatoIt.com. Con la tecnología de Blogger.