Top Ad unit 728 × 90

Recientes

recent

Curso OpenCV y C++ con Visual Studio 2013 (2-25) - Clase Mat, Mostrar imágenes y detector de Bordes Canny

Buen día amigos de IncanatoIt, Iniciamos este curso de OpenCv 3.0 con el lenguaje de programación C++ utilizando como IDE de desarrollo Visual Studio 2013.
En este artículo revisaremos el contenedor básico para poder trabajar con imágenes en OpenCv y C++, también se trabajará con Ventanas.

Imágenes Digitales


Tenemos varias formas de adquirir imágenes digitales del mundo real: cámaras digitales, escáneres de tomografía computarizada y la resonancia magnética para nombrar unos pocos. En todos los casos lo que nosotros (los humanos) vemos son imágenes. Sin embargo, al transformar esto a nuestros dispositivos digitales lo que registramos son valores numéricos para cada uno de los puntos de la imagen (más detalle en http://docs.opencv.org).


Clase Mat - Contenedor Básico de Imágenes en OpenCv y C++
Cuando aparece Opencv 2001 basado en el lenguaje C se utiliza la estructura IplImage para representar imágenes, pero usando esta estructura surge un gran problema se tiene que gestionar la memoria de manera manual.
Afortunadamente C ++ dio la vuelta e introdujo el concepto de clases que hacen más fácil para el usuario a través de la gestión automática de memoria. 

Clase Mat
Mat es básicamente una clase con dos partes de datos: la cabecera de matriz (que contiene información tal como el tamaño de la matriz, el método utilizado para almacenar, la dirección en la que es almacenada la matriz, y así sucesivamente) y un puntero a la matriz que contiene el valores de píxel (de tomar cualquier dimensionalidad dependiendo del método elegido para almacenar). 
El tamaño de la cabecera de matriz es constante, sin embargo el tamaño de la matriz en sí puede variar de imagen a imagen y por lo general es mayor en varios órdenes de magnitud.

Mostrar una Imagen en OpenCv y C++
1. Declararemos primero nuestro objeto imagen de la clase Mat para cargar nuestra imagen de disco.
cv::Mat imagen;
2. Declararemos después nuestra ventana de tamaño ajustable.
cv::namedWindow("Ventana", CV_WINDOW_AUTOSIZE);
3. Cargaremos nuestra imagen de disco Duro.
imagen=cv::imread("D:\\pruebaopencv\\familia2.jpg");
4. Mostraremos nuestra imagen en la ventana creada.
cv::imshow("Ventana",imagen);
Como puedes ver no estoy utilizando "namespaces" que se utiliza para ahorrar usar los prefijos "cv::", "std::", etc. Esto se debe a que para mi es importante ver que espacio de Nombres implementa el método que estoy utiliando. Usar "namespaces" complica o dificulta la lectura del código o reconocer fácilmente métodos ajenos y quién los provee.

Código: Mostrar Imágenes en OpenCv 3.0 y C++
// CursoOpenCV2410.cpp: Juan Carlos Arcila Díaz.

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

int _tmain(int argc, _TCHAR* argv[])
{
 //Declaramos la imagen
 cv::Mat imagen;
 //Declaramos una ventana vacía de tamaño ajustable en OpenCv donde Mostraremos la imagen
 cv::namedWindow("Ventana", CV_WINDOW_AUTOSIZE);
 //Cargamos la Imagen a Mostrar
 imagen=cv::imread("D:\\pruebaopencv\\familia2.jpg");
 //Mostramos la imagen en la ventana
 cv::imshow("Ventana",imagen);

 cv::waitKey(0);
 cv::destroyWindow("Ventana");
}

Detector de bordes Canny
El detector de Canny Edge fue desarrollado por John F. Canny en 1986. También conocido por muchos como el detector óptimo, el algoritmo de Canny pretende satisfacer tres criterios principales (Leer más en http://docs.opencv.org):

  • Baja tasa de error: Significado una buena detección de sólo bordes existentes.
  • Buena localización: La distancia entre los píxeles del borde detectado y borde verdadero píxeles debe ser el menor posible.
  • Respuesta mínima: Sólo una respuesta del detector por filo.
Imagen en color RGB - Imagen a escala de Grises

Imagen Desenfocada - Imagen con bordes detectados
Pasos para Utilizar Detector de Bordes Canny

1. Necesariamente convertimos la imagen a escala de Grises (Usando la función cvtColor).
cv::cvtColor(image,gris,CV_BGR2GRAY);
2. Desenfocamos la imagen utilizando la Función GaussianBlur, con un filtro de tamaño de núcleo 7.
cv::GaussianBlur(gris,blur,cv::Size(7,7),1.5,1.5);
3. Aplicamos la función OpenCv Canny.
cv::Canny(blur,borde,0,30,3);
 Código: Detector de bordes Canny de Imágenes en OpenCv 3.0 y C++


// CursoOpenCV2410.cpp: Juan Carlos Arcila Díaz.
#include "stdafx.h"
#include "opencv2\opencv.hpp"

int _tmain(int argc, _TCHAR* argv[])
{
    //Declaramos las imágenes a utilizar que serán de la clase Mat
    cv::Mat image,gris,blur,borde;

    //Leemos la imagen de Archivo
    image=cv::imread("D:\\pruebaopencv\\familia2.jpg");

    //Creamos nuestras dos ventanas
    cv::namedWindow("Imagen",CV_WINDOW_AUTOSIZE);
    cv::namedWindow("Gris",CV_WINDOW_AUTOSIZE);
    cv::namedWindow("Blur",CV_WINDOW_AUTOSIZE);
    cv::namedWindow("Borde",CV_WINDOW_AUTOSIZE);

    //Convertimos la imagen a escala de grises
    cv::cvtColor(image,gris,CV_BGR2GRAY);
    //Suavizamos la imagen (desenfoque Gaussiano) utilizando la función Gaussian Blur
    cv::GaussianBlur(gris,blur,cv::Size(7,7),1.5,1.5);
    //Utilizamos la función Canny para detectar bordes
    cv::Canny(blur,borde,0,30,3);

    //Mostramos las imágenes
    cv::imshow("Imagen",image);
    cv::imshow("Gris",gris);
    cv::imshow("Blur",blur);
    cv::imshow("Borde",borde);
}


Saludos Imperio, un abrazo a la distancia!
Curso OpenCV y C++ con Visual Studio 2013 (2-25) - Clase Mat, Mostrar imágenes y detector de Bordes Canny Reviewed by Juan Carlos Arcila Díaz on 13:48 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.