Documentos de Académico
Documentos de Profesional
Documentos de Cultura
OpenCV PDF
OpenCV PDF
Tulancingo
Reporte de Estadía
en el
Laboratorio de Óptica y Sistemas de Visión por
Computadora
Asesora
Dra. Carina Toxqui Quitl
Universidad Politécnica de Tulancingo
2
Universidad Politécnica de Tulancingo
Resumen
3
Universidad Politécnica de Tulancingo
4
Universidad Politécnica de Tulancingo
Índice general
1. Introducción ……………………………………………………………………………………..……..7
2. Estructura de OpenCV ……………………………………………………………………..……..11
2.1 Procesamiento de imágenes y algoritmos de visión …………………..……….12
2.1.1 Binarización……………………………………………………………………………12
2.1.2 Trasformación gamma…………………………………………………………….16
2.1.3 Histograma y Ecualización del Histograma ................. ...................18
2.1.4 Laplaciano ………………………………………………………………….………….21
2.2 Estructura y Algoritmos………………………………………………………...……………23
2.2.1 Dilatación y Erosión ……………..………………………………………………….23
2.2.2 Canny ……………………………………………………………………………………..25
3. Sistema de Visión por Computadora …………………………………………………………27
3.1 Control de calidad ……………………………………………………………………………..30
3.2 Análisis de la marcha …………………………………………………………………………33
3.3 Lenguaje a Señas ..…………………………………………………………………………….36
4. Conclusiones …………………………………………………………………………………………..39
5. Apéndice - CUDA ………………………………………………………………………………………41
6. Referencias ……………………………………………………………………………………………..43
5
Universidad Politécnica de Tulancingo
6
Universidad Politécnica de Tulancingo
Capítulo 1
Introducción
Se llevó a cabo la búsqueda de una nueva herramienta de visión por computadora que
permita procesar información en tiempo real. Para esto se escogió la biblioteca de
OpenCV. Es una biblioteca que cuenta con mas de 500 funciones las cuales están
enfocadas a visión por computadora y están basadas en un lenguaje de programación
como es “C” y “C++” y es muy familiar para cualquier desarrollador del área de
Sistemas Computacionales.
OpenCV permite procesar imágenes en tiempo real y es muy sencillo hacer interactuar
con la cámara y la biblioteca ya que es una de sus características, la desventaja que
podremos encontrar es que al trabajar video el procesamiento de la CPU es muy
tardado. Para ello necesitaríamos utilizar la GPU con la ayuda de la interfaz de CUDA
mediante la programación en paralelo para poder combinar la CPU con la GPU.
Problema
Propuesta
Utilizar la biblioteca de OpenCV ya que contiene más de 500 funciones para el área de
visión por computadora en tiempo real, procesando imágenes digitales y reduciendo
costos de tiempo en la ejecución en su procesamiento.
7
Universidad Politécnica de Tulancingo
Objetivo
Dar a conocer algunas de las funciones que brinda OpenCV para poder tener una
herramienta de procesamiento en tiempo real que va a permitir reducción de tiempos
en procesamiento.
OpenCV
8
Universidad Politécnica de Tulancingo
9
Universidad Politécnica de Tulancingo
¿Por qué OpenCV?
Es una librería que funciona para C/C++, por ser una librería completa en
funciones para realizar operaciones sobre imágenes.
• Análisis estructural,
• Análisis de movimiento,
Su licencia de OpenCV
Intel fue el pionero en el desarrollo de OpenCV, sin embargo su licencia permite el
desarrollo con las bibliotecas e inclusive la modificación y distribución de las mismas,
también la explotación, investigación y comercialización.
10
Universidad Politécnica de Tulancingo
Capítulo 2
Estructura de OpenCV
Introducción
11
Universidad Politécnica de Tulancingo
En esta investigación de las cuatro grupos con los que cuenta OpenCV solo se
utilizaron: “CV, HighGUI, CXCORE”.
12
Universidad Politécnica de Tulancingo
2.1.1 Binarización
Esta operación transforma la imagen a solo dos colores blanco y negro. El proceso
para binarizar la imagen es el siguiente:
3. Se compara cada píxel: si el valor del píxel es menor a la mediana entonces ese
píxel toma el valor mínimo permitido, caso contrario toma el valor máximo
permitido.
13
Universidad Politécnica de Tulancingo
Código desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para la
Binarización de imágenes.
#include "cv.h"
#include "highgui.h"
#include "math.h"
int main()
{
IplImage* src; // imagen de color base
IplImage* colorThresh; // contendrá la imagen de color binarizada
IplImage* gray; // contendrá la imagen convertida en escala de grises
IplImage* grayThresh; // imagen binaria conseguida a partir de la imagen en
escala de grises
//getch (1);
return 0;
}
14
Universidad Politécnica de Tulancingo
Resultados:
15
Universidad Politécnica de Tulancingo
2.1.2 Transformaciones en intensidad
Contraste
BRILLO
Aumento de Brillo.
#include <cv.h>
#include <highgui.h>
#include <iostream>
/// operaciones
16
Universidad Politécnica de Tulancingo
for( int y = 0; y < image.rows; y++ )
{ for( int x = 0; x < image.cols; x++ )
{ for( int c = 0; c < 3; c++ )
{
new_image.at<Vec3b>(y,x)[c] =
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
}
}
}
Resultado:
17
Universidad Politécnica de Tulancingo
Histograma.
El histograma es una gráfica que relaciona los niveles de intensidad de una imagen y
el número de píxeles que poseen tal nivel de intensidad.
Código desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el calculo
del histograma de una imagen.
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
/**
* @funcion main
*/
int main( int argc, char** argv )
{
Mat src, dst;
if( !src.data )
{ return -1; }
18
Universidad Politécnica de Tulancingo
// dibuja el histograma
int hist_w = 512; int hist_h = 400;
int bin_w = cvRound( (double) hist_w/histSize );
/// Resulatdos
normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
waitKey(0);
return 0;
}
Resultado:
19
Universidad Politécnica de Tulancingo
La ecualización del histograma se aplica cuando se desea lograr una distribución más
uniforme entre el número de píxeles referido a los diferentes niveles de intensidad
presentes en la imagen. Un histograma que se extienda en el intervalo de niveles de
gris.
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
if( !src.data )
{ cout<<"Usage: ./Histogram <path_to_image>"<<endl;
return -1;}
return 0;
20
Universidad Politécnica de Tulancingo
}
Resultados:
2.1.4 Laplaciano
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
int c;
21
Universidad Politécnica de Tulancingo
if( !src.data )
{ return -1; }
///crea la ventana
namedWindow( window_name, CV_WINDOW_AUTOSIZE );
waitKey(0);
return 0;
}
Resultado:
22
Universidad Politécnica de Tulancingo
Las Estructuras y Algoritmos en OpenCV cuenta con una gran cantidad de funciones
que podemos encontrar como por ejemplo: suma, resta, multiplicación, media.
Operaciones- binarias. Dilatación, Erosión, Canny, etc.
Dilatación
Erosión
Los efectos son de 'encogimiento', 'contracción', o 'reducción'. Puede ser utilizado para
eliminar islas menores en tamaño que el elemento estructural.
Código desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para los
operadores de Dilatación y Erosión.
#include "cv.h"
#include "highgui.h"
#include "math.h"
int main()
{
IplImage* src; // imagen de color base
IplImage* colorThresh; // contendrá la imagen de color binarizada
IplImage* gray; // contendrá la imagen convertida en escala de grises
IplImage* grayThresh; // imagen binaria conseguida
// a partir de la imagen en escala de grises
23
Universidad Politécnica de Tulancingo
cvShowImage( "src", src );
cvNamedWindow( "gray", 1 ); // representamos la imagen de intensidad
cvShowImage( "gray", gray );
cvThreshold(src, colorThresh, threshold, maxValue, thresholdType);
// binarizamos la imagen de color
cvThreshold(gray, grayThresh, threshold, maxValue, thresholdType);
// binarizamos la imagen de intensidad
cvNamedWindow( "colorThresh", 1 ); // representamos la imagen
// de color binarizada
cvShowImage( "colorThresh", colorThresh );
cvNamedWindow( "grayThresh", 1 ); // representamosla imagen
// de intensidad binarizada
cvSaveImage("camigris.bmp", gray);
cvSaveImage("camibina.bmp", grayThresh);
cvShowImage( "grayThresh", grayThresh );
cvWaitKey(0); // pulsamos tecla para terminar
cvDestroyWindow( "src" ); // destruimos todas las ventanas
cvDestroyWindow( "colorThresh" );
cvDestroyWindow( "gray" );
cvDestroyWindow( "grayThresh" );
cvReleaseImage( &src ); // eliminamos todas las imágenes
cvReleaseImage( &colorThresh );
cvReleaseImage( &gray );
cvReleaseImage( &grayThresh );
//getch (1);
return 0;
}
Resultado:
24
Universidad Politécnica de Tulancingo
2.2.1 Canny
Código:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
int edgeThresh = 1;
int lowThreshold;
int const max_lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;
char* window_name = "Edge Map";
/**
* @funcion CannyThreshold
*/
void CannyThreshold(int, void*)
{
/// Reducir el ruido con un kernel de 3x3
blur( src_gray, detected_edges, Size(3,3) );
25
Universidad Politécnica de Tulancingo
if( !src.data )
{ return -1; }
/// Crear una matriz del mismo tipo y tamaño como src
dst.create( src.size(), src.type() );
return 0;
}
Resultado:
Capítulo 3
Sistema de Visión por
Computadora
Introducción
27
Universidad Politécnica de Tulancingo
En esta imagen se muestra el plano imagen del cual salen 3 haces de luz. El primero
sale de forma paralela llega el lente, y le cambia la trayectoria pasando por F ’ que es su
punto focal y continua su trayectoria.
El segundo haz de luz sale de forma paralela pasando por en medio de la lente. El
tercer haz de luz pasa por F por el punto focal, pasando por la lente y continúa. En la
intersección de estos haces de luz se encuentra el plano imagen.
28
Universidad Politécnica de Tulancingo
Sensor
Diafragma
Lente
El diafragma nos va a permitir controlar qué tanto de luz va ingresar para el grabado
de la imagen, el sensor nos va a permitir, dependiendo de las características del
mismo, la calidad de la imagen que vamos adquirir digitalmente.
Imagen Digital
Una imagen digital es una función f(x,y) de dos dimensiones donde x e y representan
las coordenadas del plano. f(x,y) representa la intensidad o nivel de gris de la imagen
en ese punto.
𝑓𝑥,𝑦 =
Representación en
Formato de la matriz.
Cada elemento de la
Matriz es un PIXEL con
“X” filas una intensidad f.
“Y” columnas 29
Universidad Politécnica de Tulancingo
Para llevar acabo este proyecto en el laboratorio de óptica se cuenta con los
componentes para el realizar el estudio del control de calidad.
Sistema de iluminación
En este caso en particular el objeto que vamos a analizar es una botella ya que en la
boca de la botella tiene un defecto y se desea realizar un sistema que detecte este
error para que la botella se retire de la banda de producción.
30
Universidad Politécnica de Tulancingo
Para ello en la investigación que se realizo podemos destacar algunas funciones las
cuales nos sirvieron para encontrar el defecto. Para esto ocupamos algunas funciones
de OpenCV, como Binarizacion, Contraste, Histograma, Ecualizacion del Histograma y
Laplciano.
Binarización
Original 𝑢𝑚𝑏𝑟𝑎𝑙 = 12
Binarizada
Cambio de Contraste:
31
Universidad Politécnica de Tulancingo
Calculo del Histograma:
Como se puede observar, el defecto es detectado con mayor facilidad usando el filtro
Laplaciano.
32
Universidad Politécnica de Tulancingo
3.2 Análisis de la Marcha
Para realizar esta investigación se tomaron las imágenes de una base de datos
llamada MOBO la cual se obtuvo de la red. Las imágenes originales que obtuvimos son
las siguientes:
El objeto a investigar en este caso es la forma de caminar de las personas para ello el
escenario fuera de la persona no nos interesa por ello se va a segmenta la imagen.
Para esto como tenemos 2 imágenes una sin la persona y otra con la persona para ello
vamos a realizar una resta de imágenes para poder obtener solo la persona.
Resultado de la
resta de fondo +
persona – fondo.
33
Universidad Politécnica de Tulancingo
Ya que tenemos la imagen solo con la persona la tenemos que convertir a escala de
grises para posteriormente binarizarla.
Esta es la imagen dilatada como se puede Esta es la imagen Erosión esta función
observar se rellena algunas de las partes la reduce las áreas que tenían accesos y nos y
cual no tenia pérdida pero a las vez aparece tenemos una imagen con mayor definición.
información que teníamos o al menos no era
visible
34
Universidad Politécnica de Tulancingo
Resultados:
Como se puede observar en las imágenes si hubo mejora al aplicarle las funciones de
Erosión y dilatación. Se rellenaron algunas de las partes en las cuales faltaba
información.
35
Universidad Politécnica de Tulancingo
3.3 Lenguaje a señas
El aporte que se realizo para la investigación del lenguaje a señas es la función Canny
ya que es un detector de bordes muy preciso y nos permite ver información de la mano
sin importar la forma su posición.
En estas imágenes se muestra la mano pero pareciera a simple vista que solo tiene 3
dedos pero en realidad esta formando el numero 7 del lenguaje a señas como no se
puede ver por completo toda la mano, la función Canny nos da la información de la
mano completa si importar su posición de los dedos, como se muestra en la imagen.
Ahora el problema que se tenía era que nos arrojaba información de más ya que la
función Canny es muy precisa y muestra todos los bordes de la mano y el área que
esta de fondo de la mano. Para esto se utilizo la función de Umbral para quitar un poco
el ruido que nos estaba generando de más.
36
Universidad Politécnica de Tulancingo
En la función del umbral se realizo la prueba de un umbral de 0 a 100 para ver que
nivel de umbral era el que podríamos ocupar para la función Canny.
Estas images son con un umbral igual a 25 que es donde podemos observar aun los
dedos sin importar su posición y tenemos muy poco ruido o información de mas.
37
Universidad Politécnica de Tulancingo
38
Universidad Politécnica de Tulancingo
Capítulo 4
Conclusiones
Se revisó la biblioteca de OpenCV para el procesamiento de imágenes y se
programaron algunos algoritmos en Visual Studio 2010. OpenCV es una biblioteca muy
sencilla de utilizar ya que esta esta basado en lenguaje de programación como c/c++ y
la velocidad de procesamiento es mayor a comparación de Mathcad. Para el área de
sistemas es más familiar para el desarrollador.
Se apoyó al sistema de lenguaje a señas con la función canny. La cual permitió extraer
de manera eficaz la información de señales con la mano. Se logró la detección de
bordes de las imágenes de la mano a partir de un umbral de 25.
Como trabajo a futuro se buscara implementar los algoritmos en tiempo real usando
cuda la cual esta basada en una lógica paralela. Los algoritmos para una imagen serán
extrapolados al análisis de N imágenes.
39
Universidad Politécnica de Tulancingo
40
Universidad Politécnica de Tulancingo
Apéndice A
Cuda utilizando la GPU mediante la
Programación en paralelo
En General permite a los programadores usar una variación de C/C++ para codificar
algoritmos en una GPU de NVIDIA.
41
Universidad Politécnica de Tulancingo
42
Universidad Politécnica de Tulancingo
Referencias
• Learning OpenCV Computer Vision with the OpenCV Library
• http://opencv.willowgarage.com/wiki/
• http://fi.uaemex.mx/h.a.montes/files/TI%20Reporte%20-
%20Alan%20Barbosa%20Mendoza.pdf
• http://opencv.itseez.com/index.html
• https://groups.google.com/group/opencv-espanol?hl=es&lnk=srg
• http://docencia-eupt.unizar.es/ctmedra/tutorial_opencv.pdf
• http://tech.groups.yahoo.com/group/OpenCV/
43