Está en la página 1de 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.

, =

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

X filas

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

Objeto bajo anlisis

Cmara CCD sensor


Lente

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

= 12

Binarizada

Cambio de Contraste:

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

También podría gustarte