You are on page 1of 43

Universidad Politcnica de Tulancingo

Programacin en C++ usando la biblioteca de OpenCV


por Martin Enrique Martnez Hernndez

Reporte de Estada
en el Laboratorio de ptica y Sistemas de Visin por Computadora Asesora Dra. Carina Toxqui Quitl

Universidad Politcnica de Tulancingo

Universidad Politcnica de Tulancingo

Resumen
En este reporte de estada se analizan e implementan las funciones ms comunes del procesamiento digital de imgenes usando la biblioteca de OpenCV. Los algoritmos presentados son desarrollados en Visual Studio 2010.

Se abordan tres problemas en el contexto de Visin por Computadora. El control de calidad de botellas PET, la segmentacin de imgenes y la detencin de bordes para el anlisis del lenguaje a seas.

Universidad Politcnica de Tulancingo

Universidad Politcnica de Tulancingo

ndice general
1. Introduccin ....7 2. Estructura de OpenCV ....11 2.1 Procesamiento de imgenes y algoritmos de visin ...12 2.1.1 Binarizacin12 2.1.2 Trasformacin gamma.16 2.1.3 Histograma y Ecualizacin del Histograma ................. ...................18 2.1.4 Laplaciano ..21 2.2 Estructura y Algoritmos...23 2.2.1 Dilatacin y Erosin ...23 2.2.2 Canny ..25 3. Sistema de Visin por Computadora 27 3.1 Control de calidad ..30 3.2 Anlisis de la marcha 33 3.3 Lenguaje a Seas ...36 4. Conclusiones ..39 5. Apndice - CUDA 41 6. Referencias ..43

Universidad Politcnica de Tulancingo

Universidad Politcnica de Tulancingo

Captulo 1
Introduccin
Se llev a cabo la bsqueda de una nueva herramienta de visin por computadora que permita procesar informacin en tiempo real. Para esto se escogi la biblioteca de OpenCV. Es una biblioteca que cuenta con mas de 500 funciones las cuales estn enfocadas a visin por computadora y estn basadas en un lenguaje de programacin como es C y C++ y es muy familiar para cualquier desarrollador del rea de Sistemas Computacionales. OpenCV permite procesar imgenes en tiempo real y es muy sencillo hacer interactuar con la cmara y la biblioteca ya que es una de sus caractersticas, la desventaja que podremos encontrar es que al trabajar video el procesamiento de la CPU es muy tardado. Para ello necesitaramos utilizar la GPU con la ayuda de la interfaz de CUDA mediante la programacin en paralelo para poder combinar la CPU con la GPU.

Problema En los procesos de Visin por Computadora se requiere de un anlisis y procesamiento de series de imgenes en tiempo real. Lo cual no ha sido logrado debido a que el procesado en CPU que actualmente se realiza es muy tardado.

Propuesta Utilizar la biblioteca de OpenCV ya que contiene ms de 500 funciones para el rea de visin por computadora en tiempo real, procesando imgenes digitales y reduciendo costos de tiempo en la ejecucin en su procesamiento.
7

Universidad Politcnica 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 reduccin de tiempos en procesamiento.

OpenCV

Es una librera de tratamiento de imgenes, destinada principalmente a aplicaciones de visin por computadora en tiempo real. Son un conjunto de bibliotecas de C y C++ de cdigo libre, orientadas a visin por computadora. Puede ser usado en Windows, Linux y MacOS

Universidad Politcnica de Tulancingo

Universidad Politcnica de Tulancingo


Por qu OpenCV? Contienen herramientas para la interpretacin de la imagen. Contiene una variedad de ejemplos que ayudan a comprender su funcionamiento adems de que en la red existen grupos de ayuda especializada. Es una librera que funciona para C/C++, por ser una librera completa en funciones para realizar operaciones sobre imgenes. Es una biblioteca gratuita. Realiza anlisis de movimiento y seguimiento de objetos. La biblioteca esta en constante actualizacin al inicio de mi investigacin estaba la versin 2.2 y ya cuenta con la versin 2.4. Para procesar video en OpenCV es muy tardado para ellos se necesitara de ayuda de la GPU.

Qu podemos hacer con OpenCV? OpenCV nos permite entre muchas otras cosas: Operaciones bsicas, como (suma, productos, integraciones, derivaciones, etc.) Procesado de imgenes y anlisis, Anlisis estructural, Anlisis de movimiento, Reconstruccin 3d y calibracin de la cmara, Interfaz grfica y adquisicin,

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 modificacin y distribucin de las mismas, tambin la explotacin, investigacin y comercializacin.

10

Universidad Politcnica de Tulancingo

Captulo 2
Estructura de OpenCV
Introduccin

En este capitulo se describe la librera de OpenCV para el anlisis y procesamiento de imgenes. Se proporciona el cdigo de algunas tareas bsicas para el mejoramiento y realce en imgenes.

Estas bibliotecas se dividen en cuatro grandes grupos:

1. CXCORE: Donde se encuentran las estructuras y algoritmos bsicos que usan las dems funciones. Ejemplo: suma, media. Operacionesbinarias. etc. 2. CV: donde estn implementadas las funciones principales de procesamiento de imgenes. Ejemplo: Erosin, Dilatacin, Operaciones bsicas de umbralizacin, Derivados de Sobel, Operador de Laplace, etc. 3. HighGUI: todo lo relacionado a la interfaz grfica de OpenCV y las funciones que permiten importar imgenes y video.

11

Universidad Politcnica de Tulancingo

4. ML: que cuenta con algoritmos de aprendizaje, clasificadores.

En esta investigacin de las cuatro grupos con los que cuenta OpenCV solo se utilizaron: CV, HighGUI, CXCORE.

12

Universidad Politcnica de Tulancingo

2. 1 Procesamiento de Imgenes y Algoritmos de visin.


El objetivo de procesamiento de imgenes es mejorar la calidad de las imgenes para su posterior utilizacin o interpretacin. Para ello OpenCV cuenta con unas gran Biblioteca con ms 500 funciones las cuales estn diseadas para Algoritmos de visin por computadora.

2.1.1 Binarizacin

Esta operacin transforma la imagen a solo dos colores blanco y negro. El proceso para binarizar la imagen es el siguiente: 1. Se encuentra la mediana (dato de en medio) de los valores permitidos para cada pxel. 2. Se toma uno por uno los pxeles de la imagen.

3. Se compara cada pxel: si el valor del pxel es menor a la mediana entonces ese pxel toma el valor mnimo permitido, caso contrario toma el valor mximo permitido.

13

Universidad Politcnica de Tulancingo


Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para la Binarizacin de imgenes.
#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 int threshold = 120; // definimos el valor umbral int maxValue = 255; // definimos el valor mximo int thresholdType = CV_THRESH_BINARY; // definimos el tipo de binarizacin src = cvLoadImage("lena.bmp", 1); // cargamos imagen de color colorThresh = cvCloneImage( src ); // copiamos esa imagen de color gray=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1 ); // la imagen de intensidad tendr la misma configuracin // que la fuente pero con un solo canal cvCvtColor( src, gray, CV_BGR2GRAY ); // pasamos la imagen de color a escala de grises grayThresh = cvCloneImage( gray ); // copiamos la imagen en escala // de grises (truco anterior) cvNamedWindow( "src", 1 ); // representamos la imagen de color 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("lena1.bmp", gray); // guardamos la imagen cvSaveImage("lena2.bmp", grayThresh); // guardamos la imagen 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 imgenes cvReleaseImage( &colorThresh ); cvReleaseImage( &gray ); cvReleaseImage( &grayThresh ); //getch (1); return 0; }

14

Universidad Politcnica de Tulancingo

Resultados:

Imagen escala a grises

Imagen Binarizada con umbral = 120

15

Universidad Politcnica de Tulancingo


2.1.2 Transformaciones en intensidad

Contraste El contraste es la relacin entre las intensidades de los pixeles en una imagen, tambin se puede definir como la relacin entre la iluminacin mxima y mnima de un objeto.

BRILLO El brillo es la luz que refleja o emite un cuerpo. La forma de aumentar o disminuir el brillo es incrementando o disminuyendo el valor de los pxeles de cada canal.

Aumento de Brillo. En esta operacin se aumenta la intensidad en una imagen. Esta operacin la realizo en combinacin de varias funciones, no existe una funcin que por si sola haga la operacin.

Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el mejoramiento del contraste en una imagen.
#include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; double alpha; /**< Control de contraste simple */ int beta; /**< Control de brillo simple */ int main( int argc, char** argv ) { /// Leer la imagen dada por el usuario Mat image = imread( "lena.bmp",1 ); Mat new_image = Mat::zeros( image.size(), image.type() ); /// Inicializar los valores std::cout<<" contraste y brillo "<<std::endl; std::cout<<"-------------------------"<<std::endl; std::cout<<"* contraste [0-20]: ";std::cin>>alpha; std::cout<<"* brillo [0-100]: "; std::cin>>beta; /// operaciones

16

Universidad Politcnica 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 ); } } } /// crea la ventana namedWindow("Imagen Original", 1); namedWindow("Imagen Nueva", 1); /// muestra las imagenes imshow("Imagen Original", image); imshow("Imagen Nueva", new_image); /// Esperar hasta que el usuario pulsa alguna tecla waitKey(); return 0; }

Resultado:

Imagen Original

Imagen con cambio en contraste = 2 y brillo =50

La aplicacin pide que introduzcas un valor de contraste de 0 a 20 y un brillo de 0 a 100 para poder dar una imagen resultante.

17

Universidad Politcnica de Tulancingo

2.1.3 Histograma y Ecualizacin del Histograma Histograma. El histograma es una grfica que relaciona los niveles de intensidad de una imagen y el nmero de pxeles que poseen tal nivel de intensidad. Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el calculo del histograma de una imagen.
#include #include #include #include "opencv2/highgui/highgui.hpp" "opencv2/imgproc/imgproc.hpp" <iostream> <stdio.h>

using namespace std; using namespace cv; /** * @funcion main */ int main( int argc, char** argv ) { Mat src, dst; /// cargar imagen src = imread( "lena.bmp", 1 ); if( !src.data ) { return -1; } /// separa las imagenes en los 3 colores ( R,G,B ) vector<Mat> bgr_planes; split( src, bgr_planes ); /// establecer el contador int histSize = 256; /// establecer rangos ( para B,G,R) ) float range[] = { 0, 256 } ; const float* histRange = { range }; bool uniform = true; bool accumulate = false; Mat b_hist, g_hist, r_hist; /// calcular los histogramas: calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate ); calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate ); calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );

18

Universidad Politcnica de Tulancingo


// dibuja el histograma int hist_w = 512; int hist_h = 400; int bin_w = cvRound( (double) hist_w/histSize ); Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) ); /// 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() ); /// dibuja para cada canal de RGB for( int i = 1; i < histSize; i++ ) { line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ),Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ), Scalar( 255, 0, 0), 2, 8, 0 ); line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ) , Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),Scalar( 0, 255, 0), 2, 8, 0 ); line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) , Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ), Scalar( 0, 0, 255), 2, 8, 0 ); } /// mostrar resultado namedWindow("resultado histograma", CV_WINDOW_AUTOSIZE ); imshow("resultado histograma", histImage ); waitKey(0); return 0; }

Resultado:

Imagen original

Histograma por canal rojo, verde y azul (RGB).

19

Universidad Politcnica de Tulancingo

Ecualizacin del histograma. La ecualizacin del histograma se aplica cuando se desea lograr una distribucin ms uniforme entre el nmero de pxeles referido a los diferentes niveles de intensidad presentes en la imagen. Un histograma que se extienda en el intervalo de niveles de gris.

Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para la ecualizacin del histograma.
#include #include #include #include "opencv2/highgui/highgui.hpp" "opencv2/imgproc/imgproc.hpp" <iostream> <stdio.h>

using namespace cv; using namespace std; /** @funcion main */ int main( int argc, char** argv ) { Mat src, dst; char* source_window = "imagen original"; char* equalized_window = "Equalized Image"; /// carga la imagen src = imread( "lena.bmp", 1 ); if( !src.data ) { cout<<"Usage: ./Histogram <path_to_image>"<<endl; return -1;} /// convierte a escala de grises cvtColor( src, src, CV_BGR2GRAY ); /// plicar la ecualizacion del histograma equalizeHist( src, dst ); /// mostrar resultados namedWindow( source_window, CV_WINDOW_AUTOSIZE ); namedWindow( equalized_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); imshow( equalized_window, dst ); /// guardar la imagen ecualizada cvSaveImage("lenaecua.bmp", &IplImage(dst)); /// esperar asta cerrar la aplicacion waitKey(0); return 0;

20

Universidad Politcnica de Tulancingo


}

Resultados:

Imagen Original

Imagen resultante de la ecualizacin de su histograma.

2.1.4 Laplaciano Es un operador ideal para detectar bordes independientes de la orientacin o direccin de los mismos. Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el operador de Laplaciano.
#include #include #include #include "opencv2/imgproc/imgproc.hpp" "opencv2/highgui/highgui.hpp" <stdlib.h> <stdio.h>

using namespace cv; /** @funcion main */ int main( int argc, char** argv ) { Mat src, src_gray, dst; int kernel_size = 3; int scale = 1; int delta = 0; int ddepth = CV_16S; char* window_name = "Laplace"; int c; /// carga la imagen src = imread( "lena.bmp",1 );

21

Universidad Politcnica de Tulancingo


if( !src.data ) { return -1; } ///Eliminar el ruido al difuminar con un filtro gaussiano GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); /// convierte la imagen a escala de grises cvtColor( src, src_gray, CV_RGB2GRAY ); ///crea la ventana namedWindow( window_name, CV_WINDOW_AUTOSIZE ); /// aplica la funcion la place Mat abs_dst; Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); convertScaleAbs( dst, abs_dst ); /// guara la imagen cvSaveImage("lenalaplace.bmp", &IplImage(dst)); /// mostrar el contenido imshow( window_name, abs_dst ); waitKey(0); return 0; }

Resultado:

Imagen realzada usando el filtro espacial Laplaciano.

22

Universidad Politcnica de Tulancingo

2.2 Estructuras y Algoritmos Las Estructuras y Algoritmos en OpenCV cuenta con una gran cantidad de funciones que podemos encontrar como por ejemplo: suma, resta, multiplicacin, media. Operaciones- binarias. Dilatacin, Erosin, Canny, etc. 2.2.1 Dilatacin y Erosin Dilatacin Este operador es comnmente conocido como 'relleno', 'expansin' o 'crecimiento'. Puede ser usado para rellenar 'huecos' de tamao igual o menor que el elemento estructurante con la que se opera la dilatacin. Erosin Los efectos son de 'encogimiento', 'contraccin', o 'reduccin'. Puede ser utilizado para eliminar islas menores en tamao que el elemento estructural. Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para los operadores de Dilatacin y Erosin.
#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 int threshold = 30; // definimos el valor umbral int maxValue = 255; // definimos el valor mximo int thresholdType = CV_THRESH_BINARY; // definimos el // tipo de binarizacin src = cvLoadImage("lena.bmp", 1); // cargamos imagen de color colorThresh = cvCloneImage( src ); // copiamos esa imagen de color gray=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1 ); // la imagen de intensidad tendr la misma configuracin // que la fuente pero con un solo canal cvCvtColor( src, gray, CV_BGR2GRAY ); // pasamos la imagen de color // a escala de grises grayThresh = cvCloneImage( gray ); // copiamos la imagen en escala // de grises (truco anterior) cvNamedWindow( "src", 1 ); // representamos la imagen de color

23

Universidad Politcnica 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 imgenes cvReleaseImage( &colorThresh ); cvReleaseImage( &gray ); cvReleaseImage( &grayThresh ); //getch (1); return 0; }

Resultado:

Resultado de la Dilatacin.

Resultado de la Erosin

24

Universidad Politcnica de Tulancingo

2.2.1 Canny El detector de bordes Canny fue desarrollado por John F. Canny en 1986. Tambin conocido por muchos como el detector de ptimo, el algoritmo de Canny tiene como objetivo cumplir con tres criterios principales:

Baja tasa de error: Significado una buena deteccin de bordes existentes solamente. Buena localizacin: La distancia entre los pxeles del borde y los pxeles reales detectado borde tiene que ser minimizado. Respuesta mnima: Slo una respuesta del detector al borde.

Cdigo:
#include #include #include #include "opencv2/imgproc/imgproc.hpp" "opencv2/highgui/highgui.hpp" <stdlib.h> <stdio.h>

using namespace cv; /// variables globales Mat src, src_gray; Mat dst, detected_edges; 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) ); /// detector canny Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size ); /// .mouestra los resultados optenidos dst = Scalar::all(0); src.copyTo( dst, detected_edges); imshow( window_name, dst ); /// cvSaveImage("lena2.bmp", &IplImage(dst)); }

25

Universidad Politcnica de Tulancingo


/** @funcion main */ int main( int argc, char** argv ) { /// cargar imagen src = imread( "lena.bmp" ); if( !src.data ) { return -1; } /// Crear una matriz del mismo tipo y tamao como src dst.create( src.size(), src.type() ); /// Convertir la imagen a escala de grises cvtColor( src, src_gray, CV_BGR2GRAY ); /// Create a window namedWindow( window_name, CV_WINDOW_AUTOSIZE ); //cvSaveImage("11canny.jpg", &IplImage(window_name)); /// crea el Trackbar para poner el umbral createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold ); /// muestra la imagen CannyThreshold(0, 0); /// espera asta que el usuario precione una tecla waitKey(0); return 0; }

Resultado:

Imagen realzada usando el detector de bordes Canny con Umbral = 0. 26

Universidad Politcnica de Tulancingo

Captulo 3
Sistema de Visin por Computadora
Introduccin
En este captulo se abordan tres problemas de anlisis de imgenes. El primero es el control de calidad de botellas PET. Usando los algoritmos de mejoramiento de contraste, binarizacin, ecualizacin del histograma y filtraje es posible detectar el defecto de las botellas. El segundo es el anlisis de la marcha. En este se usa la resta, Binarizacin, Dilatacin y erosin para la segmentacin de imgenes. Finalmente, se aborda el problema del reconocimiento del lenguaje de seas. Usando la funcin Canny es posible extraer los bordes de la mano de manera eficaz.

27

Universidad Politcnica de Tulancingo

El sistema de visin por computadora parte de la formacin de una imagen.

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 contina. En la interseccin de estos haces de luz se encuentra el plano imagen.

28

Universidad Politcnica de Tulancingo

Para la adquirir las imgenes necesitamos una cmara Digital:

Sensor Diafragma Lente

La cmara digital esta constituida por un lente, diafragma, sensor principalmente estos 3 elementos son de gran importancia para la adquisicin de la imagen. 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 caractersticas del mismo, la calidad de la imagen que vamos adquirir digitalmente. Imagen Digital Una imagen digital es una funcin 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.

, =
X filas

Representacin en Formato de la matriz. Cada elemento de la Matriz es un PIXEL con una intensidad f.

Y columnas

29

Universidad Politcnica de Tulancingo

3.1 Control de Calidad La visin por computadora permite inspeccionar el proceso de produccin sin fatigas ni distracciones, facilitando la cuantificacin de las variables de calidad traducindose en un mejoramiento continuo.

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 iluminacin

Cmara CCD sensor Lente

Objeto bajo anlisis

Tarjeta de Adquisicin de imgenes y computadora

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 produccin.

30

Universidad Politcnica de Tulancingo


Para ello en la investigacin 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. Binarizacin

Original
Cambio de Contraste:

= 12

Binarizada

31

Universidad Politcnica de Tulancingo


Calculo del Histograma:

Ecualizacin del Histograma:

Filtraje usando el Laplaciano:

Como se puede observar, el defecto es detectado con mayor facilidad usando el filtro Laplaciano.

32

Universidad Politcnica de Tulancingo


3.2 Anlisis de la Marcha En la investigacin de la marcha humana se retomo para la investigacin de la biblioteca de OpenCV. As como poder brindar algunas funciones las cuales facilitaran la investigacin. Para realizar esta investigacin se tomaron las imgenes de una base de datos llamada MOBO la cual se obtuvo de la red. Las imgenes originales que obtuvimos son las siguientes:

Fondo

Fondo + persona

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. Segmentacin: Su objetivo es dividir la imagen en las partes que la constituyen o los objetos que la forman. En este proceso se diferencia el objeto y el fondo. Para esto como tenemos 2 imgenes una sin la persona y otra con la persona para ello vamos a realizar una resta de imgenes para poder obtener solo la persona.

Resultado de la resta de fondo + persona fondo.

33

Universidad Politcnica de Tulancingo

Ya que tenemos la imagen solo con la persona la tenemos que convertir a escala de grises para posteriormente binarizarla.

Escala a grises

Binaria

Al realizar la resta podemos observar que la persona pierde informacin en algunas reas. Para corregir esto, vamos a utilizar las funciones de Dilatacin y Erosin.

Esta es la imagen dilatada como se puede observar se rellena algunas de las partes la cual no tenia prdida pero a las vez aparece informacin que tenamos o al menos no era visible

Esta es la imagen Erosin esta funcin reduce las reas que tenan accesos y nos y tenemos una imagen con mayor definicin.

34

Universidad Politcnica de Tulancingo

Resultados:

Como se puede observar en las imgenes si hubo mejora al aplicarle las funciones de Erosin y dilatacin. Se rellenaron algunas de las partes en las cuales faltaba informacin.

Es importante hacer notar que solo la informacin de la marcha, es decir, la parte inferior del cuerpo es usada para el anlisis de la marcha humana.

35

Universidad Politcnica de Tulancingo


3.3 Lenguaje a seas El aporte que se realizo para la investigacin del lenguaje a seas es la funcin Canny ya que es un detector de bordes muy preciso y nos permite ver informacin de la mano sin importar la forma su posicin.

En estas imgenes 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 seas como no se puede ver por completo toda la mano, la funcin Canny nos da la informacin de la mano completa si importar su posicin de los dedos, como se muestra en la imagen.

Ahora el problema que se tena era que nos arrojaba informacin de ms ya que la funcin 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 funcin de Umbral para quitar un poco el ruido que nos estaba generando de ms.

36

Universidad Politcnica de Tulancingo


En la funcin del umbral se realizo la prueba de un umbral de 0 a 100 para ver que nivel de umbral era el que podramos ocupar para la funcin Canny.

Con un Umbral a 0

Con un Umbral a 100

Estas images son con un umbral igual a 25 que es donde podemos observar aun los dedos sin importar su posicin y tenemos muy poco ruido o informacin de mas.

37

Universidad Politcnica de Tulancingo

38

Universidad Politcnica de Tulancingo

Captulo 4
Conclusiones
Se revis la biblioteca de OpenCV para el procesamiento de imgenes 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 programacin como c/c++ y la velocidad de procesamiento es mayor a comparacin de Mathcad. Para el rea de sistemas es ms familiar para el desarrollador.

Se analizaron algoritmos tales como cambio de contraste y filtraje para el mejoramiento de imgenes. La deteccin de defectos se logr a partir de la imagen mejorada usando transformacin gamma =

Se analizo la segmentacin de imgenes con algoritmos aritmticos y operaciones morfolgicas, tales como dilatacin y erosin. En la segmentacin de imgenes se logr quitar el ruido y rellenar parte faltante en la imagen de entrada.

Se apoy al sistema de lenguaje a seas con la funcin canny. La cual permiti extraer de manera eficaz la informacin de seales con la mano. Se logr la deteccin de bordes de las imgenes 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 lgica paralela. Los algoritmos para una imagen sern extrapolados al anlisis de N imgenes.

39

Universidad Politcnica de Tulancingo

40

Universidad Politcnica de Tulancingo

Apndice A
Cuda utilizando la GPU mediante la
Programacin en paralelo
La unidad de procesamiento grfico o GPU es un coprocesador dedicado al procesamiento de grficos u operaciones de coma flotante, para aligerar la carga de trabajo del procesador central en aplicaciones como los videojuegos y/o aplicaciones 3D interactivas.

La programacin paralela es el uso de varios procesadores trabajando en conjunto para dar solucin a una tarea en comn, lo que se hace es dividir el trabajo y cada procesador realiza una porcin del problema al poder intercambiar datos por una red de interconexin o a travs de memoria.

La programacin paralela permite resolver problemas que no caben en un solo procesador y que no se resuelven en un tiempo razonable, se pueden ejecutar problemas con mayor complejidad mas rpidamente.

CUDA (Compute Unified Device Architecture) es una arquitectura de clculo paralelo que hace referencia tanto a un compilador como a un conjunto de herramientas de desarrollo creadas por NVIDIA. En General permite a los programadores usar una variacin de C/C++ para codificar algoritmos en una GPU de NVIDIA.
41

Universidad Politcnica de Tulancingo

42

Universidad Politcnica 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

You might also like