Sie sind auf Seite 1von 48

UNIVERSIDAD TECNOLOGICA NACIONAL

FACULTAD REGIONAL SAN NICOLAS



INGENIERIA EN ELECTRONICA




PROBLEMA DE INGENIERA

TECNICAS DIGITALES III



Aplicacin de la Visin Artificial
a la Identificacin de Figuras



Integrantes:

- Lina Anggeli, Bernardo
- Tizi, Fernando
- Vera, Marcos

Docentes:

- Profesor: Poblete Felipe
- Auxiliar: Gonzalez Mariano


AO 2008
Tcnicas Digitales III Problema de ingeniera
2
INDICE

OBJ ETIVOS DEL TRABAJ O 3
MATERIAS INTEGRADAS.........................................................................................................3
POSIBLES APLICACIONES........................................................................................................3
PROFESORES ENTREVISTADOS..............................................................................................3
BIBLIOGRAFA...........................................................................................................................4
DESARROLLO 5
INTRODUCCIN TERICA.......................................................................................................5
Interpretacin de los resultados 7
DIAGRAMA GENERAL DEL PROGRAMA..............................................................................10
TEORA DE FUNCIONAMIENTO.............................................................................................10
RESULTADOS DE LAS PRUEBAS...........................................................................................13
CONCLUSIONES........................................................................................................................16
Anexo 1 - Software Eclipse 17
Instalacin y Configuracin de OpenCV.......................................................................................19
Programa Hola Mundo en OpenCV. .............................................................................................22
Programa de Deteccin de Bordes.................................................................................................23
Programa de Filtrado....................................................................................................................26
Programa Detector de Cuadrados..................................................................................................28
Anexo 2 - Programa de Reconocimiento de Patrones 36
Reconocimiento de Patrones. Salida por Pantalla. .........................................................................48

Tcnicas Digitales III Problema de ingeniera
3
OBJETIVOS DEL TRABAJO
Utilizar la Vision Artificial para el anlisis y reconocimiento de distintas figuras, con el objeto de
poder tomar decisiones a partir de sus resultados.

MATERIAS INTEGRADAS
Informtica II:
Programacin en C/C++. Arrays. Manejo de memoria. Funciones y Procedimientos.

Anlisis de Seales y Sistemas:
Series y Transformadas de Fourier. Correlacin de Seales.

Tcnicas Digitales III:
Programacin en Ambiente de PC (C y Assembler).

POSIBLES APLICACIONES
Las aplicaciones posibles son: Eleccin de diferentes tipos de productos que cumplan con un
determinado patrn, inspeccin visual de fallas en materiales y deteccin de figuras.

PROFESORES ENTREVISTADOS
Hemos intercambiado opiniones con el ayudante de la ctedra de Tcnicas Digitales III, Ing.
Mariano Gonzlez, con respecto del uso de algunas libreras para programacin. El nos asesor en
cuanto a la utilizacin de libreras que se utilizan para dichas aplicaciones habitualmente.
Nos entrevistamos con el ayudante de prctica de Informtica II, Ing. Ramiro Votta, para obtener
ayuda acerca de la programacin en C/C++y con el Ing. Luciano Cullen, que tiene experiencia en
el tema de visin artificial (realiz un proyecto al respecto).







Tcnicas Digitales III Problema de ingeniera
4
BIBLIOGRAFA
Organizacin de Computadoras. Tanenbaum, Andrew S.

Seales y Sistemas. Oppenheim, Alan; Willsky, Alan.

The Fast Fourier Transform and its Applications. BRIGHAM, Oran

The C Language Programming. Kernighan Ritchie

Tratamiento digital de Imgenes. Rafael C. Gonzalez, Richard E. Woods. Addison Wesley / Diaz
D. Santos. Ao 1996.

Introduccin al Procesamiento y Anlisis de Imgenes Digitales. (R. Molina). Departamento de
Ciencias de la Computacin e I.A. Universidad de Granada.1998.

Tcnicas y Algoritmos Bsicos de Visin Artificial. Material Didctico. Ingenieras. Universidad de
La Rioja. Ao 2006.

Procesamiento Audiovisual. Apuntes de Ctedra. Ingeniero en Informtica. IT. en Informtica de
Sistemas.Universidad de Murcia. 2007. http://dis.um.es/~ginesgm/files/doc/pav

Open Source Computer Vision Library. Reference Manual. Intel Corporation.
http://developer.intel.com

IntelImage Processing Library. Reference Manual. Intel Corporation. http://developer.intel.com
Pagina Web de Intel. http://www.intel.com/technology/computing/opencv

Foro de OpenCV. http://opencvlibrary.sourceforge.net

Introduction to OpenCV. David Stavens. Stanford Artificial Intelligence Lab.
http://ai.stanford.edu/~dstavens

Programming with Intel IPP and Intel OpenCV under GNU LINUX. Beginner's Tutorial.
Laboratoire lectrinique, Informatique et Images. Institut Universitaire de Technologie. Universit
de Bourgogne. France. 2007. http://iutlecreusot.u-bourgogne.fr

Eclipse dowloads: http://www.eclipse.org/downloads/

CDT Plugin download: http://www.eclipse.org/cdt/

Pgina Web de Dev-C/C++. http://www.bloodshed.net/devcpp.html

Configuracin de Dev-C++. http://www.cypax.net/tutorials/opencv/index


Tcnicas Digitales III Problema de ingeniera
5
DESARROLLO
INTRODUCCIN TERICA

Anlisis de imgenes: procesamiento inteligente de las imgenes orientado a la extraccin de
informacin de tipo cualitativo (qu hay en las imgenes) o cuantitativo (posiciones, tamaos,
distancias, tonos, etc.).

Deteccin de objetos: encontrar en la imagen las instancias de cierto tipo o clase de objetos.
Reconocimiento de objetos: distinguir la identidad especfica de un objeto que se conoce
que pertenece a cierta clase.
Segmentacin: separar los objetos de inters del fondo.
Seguimiento y correspondencia: encontrar la equivalencia de puntos entre dos imgenes
(por ejemplo, imgenes en una secuencia de video o en un par estreo).
Reconstruccin 3D: extraer informacin 3D de la escena, posiciones, ngulos, velocidades,
etc.


Bsqueda de patrones.

La bsqueda de patrones es una tcnica de anlisis que se puede aplicar en deteccin de objetos,
reconocimiento, seguimiento y correspondencia.

Idea de la tcnica: dada una imagen (un patrn o modelo) encontrar sus apariciones dentro
de otra imagen mayor. No se buscan slo las apariciones exactas, sino permitiendo cierto
grado de variacin respecto al patrn.

Ejemplo: Buscar el patrn:

en la imagen dada.







Resultado: numero de apariciones, localizacin de cada una y verosimilitud.

El mtodo ms sencillo de bsqueda de patrones es el template matching (comparacin de
plantillas).

Template matching: sea A una imagen (de tamao WxH), y sea P un patrn (de wxh), el resultado
es una imagen M (de tamao (W-w+1)x(H-h+1)), donde cada pxel M(x,y) indica la
verosimilitud (probabilidad) de que el rectngulo [x,y] [x+w-1, y+h-1] de A contenga el patrn
P.
Tcnicas Digitales III Problema de ingeniera
6


La imagen M se define usando alguna funcin de diferencia (o similitud) entre dos trozos de
imagen.

M(x,y):=d({A(x,y),...,A(x+w-1,y+h-1)}, {P(0,0),..., P(w-1,h-1)})

Ejemplo. Suma de diferencias al cuadrado:

Es parecido a una convolucin (es decir, es como pasar una mscara por toda la imagen)

Ejemplo. Template matching con suma de diferencias al cuadrado.

P - patrn a buscar (68x37) Imagen de entrada A (239x156)





Mapa de Matching M




Mapa superpuesto







Tcnicas Digitales III Problema de ingeniera
7
Interpretacin de los resultados

Los valores bajos (color oscuro) indican alta probabilidad de que el patrn se encuentre en esa
posicin (esquina superior izquierda).
Los valores altos (color blanco) indican probabilidad baja.
Cunto es alto o bajo? Solucin: Normalizar el resultado.

Normalizacin: dividir el resultado por:


Ejemplo. Diferencias al cuadrado normalizadas.

Se pueden usar tambin otras medidas de distancia, que no sea necesariamente diferencias al
cuadrado.

Ejemplo. Producto vectorial de patrones centrados.

donde P(a,b):=P(a,b) - Media(P). Lo mismo para A.

El valor (normalizado) est entre -1 y +1. Cuanto mayor (ms prximo a +1) ms es la probabilidad
en la que el patrn se encuentre en esa posicin.

Esta se interpreta como una correlacin entre imgenes y es el mtodo que utilizamos nosotros para
el programa.

Patron, P Imagen de entrada, A Mapa de Matching, M










Una de las principales aplicaciones del template matching es la deteccin de objetos.
Tcnicas Digitales III Problema de ingeniera
8
Proceso de deteccin de objetos usando bsqueda de patrones.

1) Conseguir un patrn, P, representativo de la clase de objetos a buscar.
2) Aplicar el template matching a la imagen, obteniendo M.
3) Buscar los mximos (o mnimos) locales de M.

3.1) Buscar el mximo absoluto,
3.2) Si M(lx, ly) es menor que cierto umbral, terminar.
3.3) Aadir la posicin (lx, ly) a una lista de localizaciones resultante del proceso.
3.4) Poner a cero en M el rectngulo [lx-w,ly-h][lx+w,ly+h].
3.5) Volver al paso 3.1.

Obviamente, la tcnica es muy sensible a cambios de escala, rotacin o deformaciones 3D de los
objetos.

Soluciones:

Utilizar varios patrones, con distintos tamaos y rotaciones.
Hacer una bsqueda multiescala. Aplicar el proceso escalando la imagen a: 50%, 75%,
100%, 125%, etc.
Usar alguna tcnica de atencin selectiva. Por ejemplo, usar color o bordes para centrar la
atencin en ciertas partes de la imagen.

Otra aplicacin interesante del template matching es la correspondencia: dado un par de imgenes
de una misma escena, encontrar los puntos equivalentes de ambas.

Idea: el patrn se extrae de una imagen y se aplica en la otra. El mximo (o mnimo)
matching indica la equivalencia de puntos.

Esta idea es muy interesante cuando por ejemplo se quiere hacer una composicin panormica de 2
o ms imgenes de sitios adyacentes en forma automtica, la clave es encontrar patrones comunes
en ambas imgenes y que tengan elementos claramente definidos.

Ejemplo. Composicin de dos imgenes a partir de dos elementos patrn.

Tcnicas Digitales III Problema de ingeniera
9


INTRODUCCIN A OPENCV

OpenCV (Open source Computer Vision library) es una librera gratuita desarrollado por Intel. Esta
librera proporciona un alto nivel funciones para el procesado de imgenes. Estas libreras permiten
a los programadores crear aplicaciones poderosas en el dominio de la visin digital. OpenCV ofrece
muchos tipos de datos de alto-nivel como juegos, rboles, grficos, matrices, etc. OpenCV es
opensource para poder funcionar en muchas plataformas.

OpenCV implementa una gran variedad de herramientas para la interpretacin de la imagen. Es
compatible con Intel Image Processing Library (IPL) que implementa algunas operaciones en
imgenes digitales. A pesar deprimitivas como binarization, filtrado, estadsticas de la imagen,
pirmides, OpenCV es principalmente una librera que implementa algoritmos para las tcnicas de
la calibracin (Calibracin de la Cmara), deteccin de rasgos, para rastrear (Flujo ptico), anlisis
de la forma (Geometra, Contorno que Procesa), anlisis del movimiento (Plantillas del
Movimiento, Estimadores), reconstruccin 3D(Transformacin de vistas), segmentacin de objetos
y reconocimiento (Histograma, etc.).
El rasgo esencial de la librera junto con funcionalidad y la calidad es su desempeo. Los
algoritmos estn basados en estructuras de datos muy flexibles, acoplados con estructuras IPL; ms
de la mitad de las funciones ha sido optimizada aprovechndose de la Arquitectura de Intel.
OpenCV usa la estructura Iplimage para crear y manejar imgenes. Esta estructura tiene gran
cantidad de campos, algunos de ellos son mas importantes que otros. Por ejemplo el width es la
anchura del Iplimage, height es la altura, depth es la profundidad en bits y nChannels el nmero de
canales (uno por cada nivel de gris de las imgenes y tres para las imgenes coloridas).
OpenCV en cuanto a anlisis de movimiento y seguimiento de objetos, ofrece una funcionalidad
interesante. Incorpora funciones bsicas para modelar el fondo para su posterior sustraccin,
generar imgenes de movimiento MHI (Motion History Images) para determinar dnde hubo
movimiento y en qu direccin, algoritmos de flujo ptico, etc. Ver ANEXOS para instalacin.
Tcnicas Digitales III Problema de ingeniera
10
DIAGRAMA GENERAL DEL PROGRAMA









TEORA DE FUNCIONAMIENTO
Descripcin de los bloques:

Imagen de Entrada: Esta ser la imagen a analizar (previamente hecha su adquisicin y
digitalizacin por el medio correspondiente) que debe tener un tamao de 320 x 240 pxeles de
ancho y alto respectivamente, y deber ser de formato de mapa de bits (BMP).


Imagen de
Entrada
Conversin de
Color
Accin
Umbralizacin
Preseleccin
Template
Matching
Decisin
Resultado

Filtrado
Tcnicas Digitales III Problema de ingeniera
11
Filtrado: En todo sistema en que se realiza el anlisis de una seal (en este caso imagen) es
necesario el filtrado con el objeto de eliminar ruidos que puedan provocar un mal funcionamiento
del mismo, entonces, la adecuada eleccin del filtro es fundamental.
Si bien nuestro sistema no tiene implementado ningn filtro, el agregado del mismo no requiere
demasiado esfuerzo. No obstante, para decidir el tipo de filtro a utilizar es importante saber el
origen o tipo de ruido al que pueden estar sometidas las imgenes de entrada (no ser lo mismo un
filtro de suavizado cuando, en realidad se requiere uno de realce), una vez determinado se prueban
las diferentes alternativas hasta que se logre el mejor resultado.

Ejemplos: En el caso en que hubiese un problema de foco en el elemento adquisidor, el filtrado
adecuado sera el realce o perfilado, que se utiliza para resaltar los bordes (aumenta variaciones en
la imagen). En el caso que existiese ruido en el canal (ruido sal y pimienta), este puede ser reducido
mediante filtros de suavizado, como Gaussianos o de Mediana.

Por nuestra parte hemos probado algunos filtros en OpenCV, bsicamente para suavizado y
deteccin de bordes, ya que pensamos usarlos en un principio en el desarrollo del sistema, pero al
cambiar de mtodo ya no fueron necesarios. Agregamos algunos ejemplos en los anexos.


Conversin de Color: Dado a que nuestro programa admite imgenes a color, es decir, de 3
canales (RGB o BGR), la conversin de color es necesaria para que no haya conflicto con el pasaje
de parmetros a las funciones de la librera OpenCV que se utilizarn, ya que algunas de ellas solo
soportan imgenes en escala de grises (1 canal).


Umbralizacin: La umbralizacin nos servir para el clculo de rea en la etapa de preseleccin, y
lo que se logra con ella es poder distinguir el fondo (en nuestro caso blanco), de la imagen de
inters en s, y as poder separar la informacin de manera que a partir de un umbral establecido
se puede decir que pertenecer al fondo y que a la imagen de inters. La imagen resultante ser
binaria.


Preseleccin: La funcin utilizada para reconocer patrones (cvMat chTempl at e) es susceptible a
cambios de escala, por lo tanto, si la entrada sobrepasa un cierto tamao, no ser posible reconocer
correctamente a que patrn corresponde.

En nuestro caso, con las imgenes que deseamos detectar, podemos lograr el reconocimiento hasta
con un 10% de error de escala, pero ms all de eso el programa no podr diferenciar las imgenes.

Se propuso como solucin crear 3 grupos de patrones; uno Standard (100%), y otros dos escalados
en +/- 50% del Standard, tomado como si fuera un error grosero del dispositivo de captura de la
imagen. Con esto se lograra comparar la imagen de entrada con los grupos de imgenes patrones
(preseleccin) y as poder seleccionar el ms conveniente para la deteccin posterior.

Como proceso de preseleccin utilizamos la relacin entre las reas de las imgenes de entrada y
patrn. Este comienza por contar la cantidad de pxeles (representativos del rea) de cada imagen
patrn de cada grupo, y se divide por la cantidad de pxeles de la imagen de entrada, de manera de
conseguir un valor mas o menos acotado para una fcil comparacin, adems de no presentar
demasiados problemas si se quiere cambiar la forma de las imgenes patrn. Si todas las imgenes
Tcnicas Digitales III Problema de ingeniera
12
de un determinado grupo cumplen con dicha condicin, se elige ese grupo para la posterior
deteccin por correlacin.
Al plantear esto nos topamos con el inconveniente de que los patrones cruz, podran confundirse
con grupos menores o mayores a la hora de compararlas, debido a su reducida rea (intrnseca por la
forma), por lo tanto debimos hacer una pequea modificacin al flujo del programa. En el se
propuso comparar primero los patrones que no son cruz y que pertenecen al grupo, y si no se
encuentra coincidencia de patrones, luego se comparen las cruces correspondientes a cada grupo.

Si bien de esta forma se pierde algo de tiempo en procesamiento, el programa sale del lazo en
cualquier caso en que se encuentre coincidencia. Adems, la probabilidad de encontrar 1 smbolo
entre 3 es mayor que encontrar 1 en 4, por ello se eligi primero comparar los otros 3 patrones y por
ultimo las cruces.

Cabe sealar que con este mtodo se podr tener idea del tamao de la imagen encontrada, que
puede ser interesante por ejemplo en una lnea de produccin de determinados productos que sern
empaquetados en distintas cajas (distintos dibujos) y si slo existen estas cuatro imgenes, se
podran detectar posibles errores de calibracin del dispositivo adquisidor o posibles modificaciones
externas de dichas imgenes.


Reconocimiento de patrones: En este bloque se implementa la funcin de reconocimiento de
patrones (cvMat chTempl at e), cuyo funcionamiento fue explicado en la introduccin terica, la que
nos entrega un valor entre 1 y 1 a partir del cual nosotros utilizamos para una correcta deteccin el
valor de umbral de comparacin de 0.9, es decir que si el resultado de la coincidencia es mayor que
0.9 (regla de decisin), podemos decir que se trata del patrn comparado.


Decisin: En este paso se decidir si las imgenes comparadas son del mismo tipo, es decir, si
tienen la misma forma y efectivamente se pueden caratular, o si no es posible hacerlo. Esta decisin
se har en base a un valor mnimo que debern cumplir los resultados del Matching para que se
pueda asegurar informacin vlida y sin errores.


Resultado: En nuestro caso se le informa al usuario la coincidencia o no de la imagen de entrada
con los patrones preestablecidos, as como tambin se muestra la imagen de entrada, el patrn
correspondiente, el mapa de Matching, el valor mximo y su localizacin y a que grupo de patrones
pertenece (chico, mediano o grande).


Accin: Este bloque no pertenece al proyecto en s, pero es interesante destacar que es posible
realizar una accin con los resultados del anlisis previo.

Ejemplo:
Un caso posible sera en una lnea de 4 tipos de productos terminados y empacados en cajas que
salgan por la misma cinta transportadora que tengan en su frente las distintas imgenes, una para
cada tipo de producto, y que se las desea separar por grupo.
Para ello, se podra disponer, por ejemplo, de 4 pistones neumticos en lnea, cada uno accionado
por una imagen determinada, cuyo control lo podra establecer el programa una vez analizado el
resultado de las imgenes de las cajas al pasar frente al elemento adquisidor.
Tcnicas Digitales III Problema de ingeniera
13
RESULTADOS DE LAS PRUEBAS
Funciones principales utilizadas por el programa:

cvMat chTempl at e( const CvAr r * image, const CvAr r * templ, const CvAr r * result,
i nt method) ;



image Imagen donde se correr la bsqueda. Debe ser de 8-bit o 32-bit floating-
point.
templ Patrn buscado; no debe ser mayor que la imagen fuente y debe ser del
mismo tipo de datos.
result Mapa de resultado de las comparaciones; monocanal o 32-bit floating-point.
method Especifica la manera en que el patrn debe ser comparado con las regiones de
la imagen. Posibilidades:
CV_TM_SQDIFF, CV_TM_SQDIFF_NORMED, CV_TM_CCORR,
CV_TM_CCORR_NORMED, CV_TM_CCOEFF,
CV_TM_CCOEFF_NORMED

Luego que la funcin termina la comparacin, los mejores coincidencias pueden ser encontradas
como mnimos globales (CV_TM_SQDIFF*) o mximos (CV_TM_CCORR* y
CV_TM_CCOEFF*) usando la funcin cvMi nMaxLoc.


cvMi nMaxLoc( I pl I mage* image, doubl e* minVal, doubl e* maxVal, CvPoi nt *
minLoc, CvPoi nt * maxLoc, I pl I mage* mask = 0) ;

image Puntero a la imagen fuente.
minVal Puntero al mnimo valor retornado.
maxVal Puntero al mximo valor retornado.
minLoc Puntero a la mnima localizacin retornada.
maxLoc Puntero a la mxima localizacin retornada.
mask Puntero a una imagen de un solo canal que acta como mscara.

Esta funcin encuentra valores de pxeles mnimos y mximos y sus posiciones en una imagen. Los
extremos son buscados por toda la imagen, ROI seleccionada o, si la imagen mscara es no nula, en
una regin de la imagen de forma arbitraria.

Otras opciones de realizacin:

Otra forma de solucionar el problema de escala de las imgenes tomadas podra ser obteniendo la
regin de inters de las imgenes (ROI), esta regin se representa con un cuadrado que debe
encerrar la forma de la imagen a comparar y no toda la imagen, y luego hacer un
redimensionamiento (rezising) de las imgenes patrn (solo su ROI) hasta que la relacin de reas
sea cercana a 1 y por ultimo hacer un Template Matching con la imagen de entrada y el grupo de
patrones escalados que cumplan la condicin impuesta.
Esta opcin es mas precisa (ya que es dinmica) pero requerira un tiempo de procesamiento mucho
mayor, ya que debe hacer un redimensionamiento de los 4 patrones y luego comparar reas.

Tcnicas Digitales III Problema de ingeniera
14
Como se mencion anteriormente en la introduccin terica, la funcin cvMat chTempl at es es
susceptible tambin a rotaciones de la imagen de entrada, lo que nos condiciona la flexibilidad del
programa. Una manera de poder salvar este inconveniente podra ser, una vez comparada el rea y
obtenido el grupo de patrones a utilizar, rotar la imagen de entrada (cuidado, slo su ROI, es decir
slo lo que nos interesa del total de la imagen), por ejemplo, cada 5 grados e ir haciendo las
comparaciones con los patrones (Matching) hasta encontrar el mximo de la imagen con cada
patrn, guardar los resultados de estos y por ltimo ver si cumplen con la regla de decisin.

Pruebas durante el proceso de realizacin de la deteccin de reas:

Antes de que esta parte del programa tenga su forma final se probaron otras funciones predefinidas
de la librera de manera de utilizar la mayor cantidad de recursos de la misma, a saber:

Media y desvo standard.

Esta fue probada para no tener que hacer la relacin entre reas y tratar de comparar por la media de
las imgenes, pero trajo problemas a la hora de hacer las comparaciones.

La funcin utilizada fue:

cvMean_St dDev( I pl I mage* image, doubl e* mean, doubl e* stddev, I pl I mage* mask=0) ;

image Puntero a la imagen fuente.
mean Puntero a la media retornada.
stddev Puntero al desvo Standard retornada.
mask Puntero a una imagen mscara de un canal.


Esta funcin calcula la media y el desvo Standard de los valores de los pxeles en toda la imagen,
en la regin de inters seleccionada (ROI) o, si mask es nula, en una regin de la imagen de forma
arbitraria.

Deteccin de esquinas.

Con estas funciones podramos haber detectado cuantas esquinas tiene la imagen y entonces poder
comparar los 3 grupos de imgenes que cumpliesen con, por ejemplo, 3 vrtices (tringulo), 4
(cuadrado), etc.
El problema fue que nos reportaba errores en algunos parmetros de la funcin y se nos hizo
complicada la implementacin, ya que tampoco en la red encontramos demasiada informacin
sobre la misma.

Las funciones utilizadas fueron:

cvPr eCor ner Det ect ( I pl I mage* image, I pl I mage* corners, I nt apertureSize) ;

image Imagen de entrada.
corners Imagen donde se guardan los resultados.
apertureSize Tamao del operador de Sobel utilizado en el algoritmo.

Tcnicas Digitales III Problema de ingeniera
15
Esta funcin encuentra las esquinas de una imagen de entrada y el resultado se guarda en otra
imagen de salida corners, de acuerdo al mtodo usado.
Si se quisiera obtener una localizacin de esquinas mas precisa, se podra usar la funcin
cvFi ndCor ner SubPi x( ) .

cvGoodFeat ur esToTr ack( I pl i mage* image, I pl i mage* eigimage, I pl i mage* tempimage,
CvPoi nt 2D32f * corners, i nt * cornerCount, doubl e qualityLevel, doubl e
minDistance) ;

image Imagen fuente con profundidad de byte, signed byte, o floating point, de
un canal.
eigimage Imagen temporal para los minimos autovalores por pixeles: floating
point, un canal.
tempimage Otra imagen temporal: floating point, un canal.
corners Parmetro de salida. Esquinas detectadas.
cornerCount Parmetro de salida. Numero de esquinas detectadas.
QualityLevel Multiplicador para el maximo autovalor; especifica la calidad mnima
aceptada de las esquinas de la imagen.
minDistance Lmite, especificando la mnima distancia posible entre las esquinas
retornadas. Se usa la distancia Euclideana.

Esta funcin encuentra esquinas cuyos autovalores sean grandes (esquinas bien definidas).

Pruebas durante el proceso de realizacin del reconocimiento de patrones:

En el proceso de eleccin de la funcin mas conveniente para el reconocimiento de patrones, y
despus de una bsqueda importante en la web, descubrimos la funcin cvMat chShapes (digo
descubrimos porque en el manual de OpenCV no aparece) que en forma similar a la utilizada por
nosotros (cvMat chTempl at e) a partir de la imagen de entrada y una patrn, debera dar un resultado
representativo de la forma de la imagen.
Al implementarla y probar con diferentes imgenes de entrada y patrn obtuvimos resultados no del
todo entendibles, y tampoco predecibles, por lo que la dejamos de lado.

Nota: Cabe destacar que esta funcin corresponde a una parte de la librera (cvaux) donde se
agregan funciones hechas por los distintos usuarios y quiz por ese motivo no haya mencin de la
misma en el manual. Tambin es difcil encontrar informacin en la red.

Funcin utilizada:

doubl e cvMat chShapes( const voi d* object1, const voi d* object2, i nt method,
doubl e parameter =0 ) ;

object1 Primer contorno o imagen en escala de grises.
object2 Segundo contorno o imagen en escala de grises.
method Mtodo de comparacin, uno de los siguientes:
CV_CONTOUR_MATCH_I1, CV_CONTOURS_MATCH_I2 o
CV_CONTOURS_MATCH_I3.
parameter Parmetro especfico del mtodo (no usado an).



Tcnicas Digitales III Problema de ingeniera
16
CONCLUSIONES
En conclusin, el software OpenCV es una herramienta poderosa y flexible para el anlisis y
tratamiento de imgenes, que al ser libre permite a cualquier programador de C/C++, con cualquier
entorno de programacin, realizar programas para alguna aplicacin determinada, ya sean en tiempo
real, como de post y pre procesamiento, volvindose una opcion interesante para implementar.

Es de destacar que si no se tiene idea previa de anlisis de imgenes, esta librera puede resultar
complicada de entender, sobre todo porque utiliza funciones especficas, y adems, hay poca
informacin prctica.






























Tcnicas Digitales III Problema de ingeniera
17
Anexo 1 - Software Eclipse
En los inicios del proyecto se propuso, por parte de los profesores de la ctedra, la utilizacin del
Software Eclipse (http://eclipse.org). Este es un entorno de programacin de J ava y C/C++,
totalmente Gratis (Freeware), desarrollado sobre una plataforma UNIX, por lo tanto, para que
funcione correctamente en plataformas Windows, es necesario un intrprete, este es MinGW,
tambin requiere la instalacin del J ava Runtime Environment (JRE), para interpretar, compilar y
correr programas en J ava. Sin este el programa dar error al ejecutarse.

Una vez instalados estos programas y tambin OpenCV en el disco, encontramos inconvenientes en
la compilacin y ejecucin del programa que habamos desarrollado para las pruebas (mostrar una
imagen con OpenCV).

Investigando un poco logramos que Eclipse nos reconociera las libreras y compilara el programa.

En propiedades del proyecto habr que incluir las libreras de OpenCV en cada uno de los
directorios de los compiladores como se muestra en la figura.



Si todo est bien, cuando se compile el programa, Eclipse nos reconocer las libreras de OpenCV,
como se aprecia en la figura a la derecha de la pantalla.

Tcnicas Digitales III Problema de ingeniera
18


Una vez compilado se procede a correr el programa y ah se nos present un problema que no
pudimos arreglar, nos daba error en la ejecucin (se muestra en la figura).



Al no encontrar solucin probando distintas alternativas de generar el ejecutable, cambiando rutas,
etc, y buscando en la web sin indicio alguno de este antecedente, decidimos cambiar de Entorno de
Programacin. Fue as que utilizamos otro software Gratuito, como lo es Dev - C++, versin 4.9.9.2
(Beta 5), que se puede bajar de http://www.bloodshed.net/.








Tcnicas Digitales III Problema de ingeniera
19
Instalacin y Configuracin de OpenCV.

INSTALACIN:

Para llevar a cabo la instalacin e integracin de OpenCV_1.0rc1 en Dev C++4.9.9.2 hacer lo
siguiente:

Instalar estos dos programas:
Dev C/C++
OpenCV_1.0rc1

Una vez instalados copiar los dll ubicados en C:\OpenCV\bin, en el directorio C:\Windows\system

CONFIGURACIN:

Ejecutamos Dev-C++y vamos hacia el men Herramientas Opciones del Compilador



En la primer pestaa Compilador aadir a la lnea de comandos del Linker como se muestra:

-lhighgui -lcv -lcxcore -lcvaux lcvcam

Tcnicas Digitales III Problema de ingeniera
20
En la pestaa Directorios y dentro de ella en Binario y tambin dentro de Libreras, aadimos
la siguiente ruta:

C:\Archivos de Programas\OpenCV\lib



Siempre dentro de la pestaa Directorios, aadimos en las pestaos "C Includes" y "C++Includes"
las siguientes rutas:

C:\Archivos de Programas\OpenCV\cxcore\include
C:\Archivos de Programas\OpenCV\cv\include
C:\Archivos de Programas\OpenCV\otherlibs\highgui
C:\Archivos de Programas\OpenCV\cvaux\include
C:\Archivos de Programas\OpenCV\otherlibs\cvcam\include

Tcnicas Digitales III Problema de ingeniera
21



Por ltimo, chequeamos las rutas de los Programas










Tcnicas Digitales III Problema de ingeniera
22
Programa Hola Mundo en OpenCV.


#i ncl ude <cv. h> / / Li br er i as a i ncl ui r
#i ncl ude <hi ghgui . h>
#i ncl ude <st di o. h>

i nt mai n( i nt ar gc, char ** ar gv)
{
/ *Def i ni ci on de Var i abl es y Const ant es*/
I pl I mage *I mg =0;
const char * wndname = "Most r ando una I magen con OpenCV";
const char * f i l ename = " f r ui t s. j pg";

/ / Car ga una i magen y l a guar da en I mg
I mg=cvLoadI mage( f i l ename, 1) ; / / si el 2 par ames 0 - > 1 canal
/ / si es 1 - > or i gi nal
i f ( ! I mg )
{
pr i nt f ( "I mposi bl e Car gar : %s\ n" , f i l ename ) ;
syst em( "Pause") ;
exi t ( 0) ;
}
el se
pr i nt f ( "I magen Most r ada: %s\ n", f i l ename) ;


/ / Cr ea una vent ana
cvNamedWi ndow( wndname, 0) ;
/ / Muest r a l a i magen en di cha vent ana
cvShowI mage( wndname, I mg) ;
/ / Esper a que se pr esi one una t ecl a
cvWai t Key( 0) ;
/ / Li ber a el espaci o de memor i a donde se car go l a i magen
cvRel easeI mage( &I mg ) ;
/ / El i mi na l a vent ana
cvDest r oyWi ndow( wndname) ;

syst em( " Pause" ) ;
r et ur n 0;
}

Salida por Pantalla.


Tcnicas Digitales III Problema de ingeniera
23
Programa de Deteccin de Bordes.


#i ncl ude <cv. h>
#i ncl ude <hi ghgui . h>
#i ncl ude <st di o. h>

i nt mai n( i nt ar gc, char ** ar gv)
{

/ *Def i ni ci on de Var i abl es y Const ant es*/
I pl I mage *I mg =0;
I pl I mage *I mg2 =0;
const char * wndname = "I magen a pr ocesar . . . " ;
/ / const char * f i l ename = " f r ui t s. j pg";
const char * f i l ename = " Di buj o. bmp";
i nt dx=1, dy=1, t h1=250, t h2=2000;
const i nt ASi ze=7;

/ *##################################################*/

I mg=cvLoadI mage( f i l ename, 0) ;
i f ( ! I mg )
pr i nt f ( "I mposi bl e Car gar : %s\ n" , f i l ename ) ;

el se
pr i nt f ( "I magen Most r ada: %s\ n", f i l ename) ;


/ **************** Fi l t r os Par a l a I magen *****************/

/ / I mg2 = cvCl oneI mage( I mg ) ;
/ / cvSobel ( I mg, I mg2, dx, dy, ASi ze ) ;
/ / cvCanny( I mg, I mg2, t h1, t h2, ASi ze ) ;

/ / Par a ut i l i zar est a f unci on hay q cr ear una i mg de 32 Fl oat y 1 canal
/ / del mi smo t amao que l a de ent r ada. . .
I mg2 = cvCr eat eI mage( cvSi ze( I mg- >wi dt h, I mg- >hei ght ) , I PL_DEPTH_32F, 0) ;
cvLapl ace( I mg, I mg2, ASi ze ) ;

/ *********************************************************/

cvNamedWi ndow( wndname, 0) ;
cvShowI mage( wndname, I mg) ;
cvNamedWi ndow( "Despues del Pr ocesami ent o", 0) ;
cvShowI mage( "Despues del Pr ocesami ent o", I mg2) ;

cvWai t Key( 0) ;
cvRel easeI mage( &I mg ) ;
cvRel easeI mage( &I mg2 ) ;
cvDest r oyWi ndow( wndname) ;
cvDest r oyWi ndow( "Despues del Pr ocesami ent o") ;

syst em( " Pause" ) ;
r et ur n 0;
}




Tcnicas Digitales III Problema de ingeniera
24

Deteccin de Bordes. Salidas por Pantalla.

Detector de Bordes de Canny:








Detector de Bordes de Laplace:

Tcnicas Digitales III Problema de ingeniera
25





Detector de Bordes de Sobel:



Tcnicas Digitales III Problema de ingeniera
26








Programa de Filtrado


#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude "cv. h"
#i ncl ude "hi ghgui . h"

i nt mai n( i nt ar gc, char *ar gv[ ] )
{



/ *Def i ni ci on de Var i abl es y Const ant es*/
I pl I mage *I mg =0;
I pl I mage *I mg2 =0;
const char * wndname = "I magen a pr ocesar . . . " ;
const char * f i l ename = " Di buj o5. bmp" ;
i nt dx=1, dy=1, t h1=250, t h2=2000;
const i nt ASi ze=7;



I mg=cvLoadI mage( f i l ename, 1) ;
i f ( ! I mg )
pr i nt f ( "I mposi bl e Car gar : %s\ n" , f i l ename ) ;

el se
pr i nt f ( "I magen Most r ada: %s\ n", f i l ename) ;

CvSi ze sz = cvSi ze( I mg- >wi dt h & - 2, I mg- >hei ght & - 2 ) ;
I pl I mage* t i mg = cvCl oneI mage( I mg ) ; / / copi a l a i magen de ent r ada
I pl I mage* pyr = cvCr eat eI mage( cvSi ze( sz. wi dt h/ 2, sz. hei ght / 2) , 8, 3 ) ;
/ / cr ea una i magen de l a mi t ad de ancho y mi t ad de al t o que l a or i gi nal

/ **************** Fi l t r os Par a l a I magen *****************/
Tcnicas Digitales III Problema de ingeniera
27

cvPyr Down( t i mg, pyr , 7 ) ; / / Downscal e i mage
cvPyr Up( pyr , t i mg, 7 ) ; / / Upscal e i mage

/ / Est a combi naci on de cambi o de escal a de l a i magen l ogr a r el l enar
/ / espaci os en l a i magen y pr oduce un ef ect o de suavi zado
/ *********************************************************/

cvNamedWi ndow( wndname, 0) ;
cvShowI mage( wndname, I mg) ;
cvNamedWi ndow( "Despues del Pr ocesami ent o", 0) ;
cvShowI mage( "Despues del Pr ocesami ent o", pyr ) ;

cvWai t Key( 0) ;
cvRel easeI mage( &I mg ) ;
cvRel easeI mage( &I mg2 ) ;
cvDest r oyWi ndow( wndname) ;
cvDest r oyWi ndow( "Despues del Pr ocesami ent o") ;

syst em( " PAUSE" ) ;
r et ur n 0;
}



Filtrado. Salidas por Pantalla.


Filtro de Suavizado















Tcnicas Digitales III Problema de ingeniera
28
Programa Detector de Cuadrados



/ / ********************************************************************
/ / The f ul l " Squar e Det ect or " pr ogr am.
/ / Est e pr ogr ama car ga var i as i magenes subsecuent ement e y t r at a de
/ / encont r ar cuadr ados en cada i magen.
/ / ********************************************************************
#i f def _CH_
#pr agma package <opencv>
#endi f

#i ncl ude "cv. h"
#i ncl ude "hi ghgui . h"
#i ncl ude <st di o. h>
#i ncl ude <mat h. h>
#i ncl ude <st r i ng. h>

i nt t hr esh = 50;
I pl I mage* i mg = 0;
I pl I mage* i mg0 = 0;
CvMemSt or age* st or age = 0;
const char * wndname = " Squar e Det ect i on Demo" ;


/ / ################ Funci n 1 ########################

/ / Funci on Auxi l i ar :
/ / Encuent r a el coseno del angul o ent r e vect or es
/ / desde pt 0- >pt 1 y desde pt 0- >pt 2( apl i caci n del pr oduct o escal ar ! ! ! )
doubl e angl e( CvPoi nt * pt 1, CvPoi nt * pt 2, CvPoi nt * pt 0 )
{
doubl e dx1 = pt 1- >x - pt 0- >x;
doubl e dy1 = pt 1- >y - pt 0- >y;
doubl e dx2 = pt 2- >x - pt 0- >x;
doubl e dy2 = pt 2- >y - pt 0- >y;
r et ur n ( dx1*dx2 + dy1*dy2) / sqr t ( ( dx1*dx1 + dy1*dy1) *( dx2*dx2 + dy2*dy2) +
1e- 10) ;
}

/ / ################ Funci n 2 ########################

/ / Ret or na l a secuenci a de cuadr ados det ect ados en l a i magen.
/ / La secuenci a es guar dada en el l ugar especi f i cado de l a memor i a
CvSeq* f i ndSquar es4( I pl I mage* i mg, CvMemSt or age* st or age )
{
CvSeq* cont our s;
i nt i , c, l , N = 11;
CvSi ze sz = cvSi ze( i mg- >wi dt h & - 2, i mg- >hei ght & - 2 ) ;
I pl I mage* t i mg = cvCl oneI mage( i mg ) ; / / make a copy of i nput i mage
I pl I mage* gr ay = cvCr eat eI mage( sz, 8, 1 ) ;
I pl I mage* pyr = cvCr eat eI mage( cvSi ze( sz. wi dt h/ 2, sz. hei ght / 2) , 8, 3 ) ;
I pl I mage* t gr ay;
CvSeq* r esul t ;
doubl e s, t ;
/ / cr ea una secuenci a vaci a aue cont endr a punt os -
/ / 4 punt os por cuadr ado ( l os ver t i ces del cuadr ado)
CvSeq* squar es = cvCr eat eSeq( 0, si zeof ( CvSeq) , si zeof ( CvPoi nt ) , st or age ) ;

Tcnicas Digitales III Problema de ingeniera
29
/ / Sel ecci ona l a Regi on de I nt er es( ROI ) maxi ma en l a i magen
/ / con el ancho y al t o di vi si bl e por 2
cvSet I mageROI ( t i mg, cvRect ( 0, 0, sz. wi dt h, sz. hei ght ) ) ;

/ / down- scal e and upscal e l a i magen par a f i l t r ar el r ui do
cvPyr Down( t i mg, pyr , 7 ) ;
cvPyr Up( pyr , t i mg, 7 ) ;
t gr ay = cvCr eat eI mage( sz, 8, 1 ) ;

/ / Encuent r a cuadr ados en cada pl ano de col or de l a i magen
f or ( c = 0; c < 3; c++ )
{
/ / Ext r ae el c- esi mo pl ano de col or
cvSet I mageCOI ( t i mg, c+1 ) ;
cvCopy( t i mg, t gr ay, 0 ) ;

/ / Pr ueba var i os ni vel es de umbr al
f or ( l = 0; l < N; l ++ )
{
/ / Not a : se puede r eempl azar " zer o t hr eshol d l evel " por Canny.
/ / Canny ayuda a capt ur ar cuadr ados con " gr adi ent shadi ng"
i f ( l == 0 )
{
/ / Apl i ca Canny.
cvCanny( t gr ay, gr ay, 0, t hr esh, 5 ) ;
/ / di l at a l a sal i da de canny par a r emover aguj er os
/ / pot enci al es ent r e segment os de esqui nas
cvDi l at e( gr ay, gr ay, 0, 1 ) ;
}
el se
{
/ / Apl i ca t hr eshol d i f l ! =0:
/ / t gr ay( x, y) = gr ay( x, y) < ( l +1) *255/ N ? 255 : 0
cvThr eshol d( t gr ay, gr ay, ( l +1) *255/ N, 255, CV_THRESH_BI NARY ) ;
}

/ / Encuent r a cont or nos y l os guar da t odos como una l i st a
cvFi ndCont our s( gr ay, st or age, &cont our s, si zeof ( CvCont our ) ,
CV_RETR_LI ST, CV_CHAI N_APPROX_SI MPLE, cvPoi nt ( 0, 0) ) ;

/ / Pr ueba cada cont or no
whi l e( cont our s )
{
/ / Apr oxi ma el cont or no con una pr esi ci on pr opor ci onal
/ / al per i met r o del cont or no

r esul t = cvAppr oxPol y( cont our s, si zeof ( CvCont our ) , st or age,
CV_POLY_APPROX_DP, cvCont our Per i met er ( cont our s) *0. 02, 0 ) ;

/ / l os cont or nos del cuadr ado deber i an t ener 4 ver t i ces despues
/ / de l a apr oxi maci on, un ar ea r el at i vament e gr ande ( par a
/ / f i l t r ar cont or nos r ui dosos) y ser convexos.
/ / Not a: el val or absol ut o del ar ea es usado por que el ar ea
/ / puede ser posi t i va o negat i va - de acuer do con l a or i ent aci on
/ / del cont or no

i f ( r esul t - >t ot al == 4 &&
f abs( cvCont our Ar ea( r esul t , CV_WHOLE_SEQ) ) > 1000 &&
cvCheckCont our Convexi t y( r esul t ) )
{
s = 0;
Tcnicas Digitales III Problema de ingeniera
30

f or ( i = 0; i < 5; i ++ )
{
/ / encuent r a el mi ni mo angul o ent r e uni ones de esqui nas
/ / ( maxi mo del coseno)
i f ( i >= 2 )
{
t = f abs( angl e(
( CvPoi nt *) cvGet SeqEl em( r esul t , i ) ,
( CvPoi nt *) cvGet SeqEl em( r esul t , i - 2 ) ,
( CvPoi nt *) cvGet SeqEl em( r esul t , i - 1 ) ) ) ;
s = s > t ? s : t ;
pr i nt f ( "Angl e: %l d %l d\ n" , t , s) ;
}
}

/ / si l os cosenos de t odos l os angul os son chi cos
/ / ( t odos son ~90 gr ados) ent onces escr i be l os ver t i ces del
/ / cuadr i l at er o en l a secuenci a r esul t ant e
/ / i f ( ( s > 0. 3) &&( s < 1) ) / / modi f i caci n or i gi nal s < 0. 3
/ *Si modi f i co el val or de compar aci n hago que mi s angul os
sean menor es q 90! ! ! */
i f ( s < 0. 3)
f or ( i = 0; i < 4; i ++ )
cvSeqPush( squar es,
( CvPoi nt *) cvGet SeqEl em( r esul t , i ) ) ;
}

/ / t oma el pr oxi mo cont or no
cont our s = cont our s- >h_next ;
}
}
}
/ / Muest r a l as i mgenes AGREGADO

/ / cvShowI mage( *gr ay, 0 ) ;
/ *cvRel easeI mage( &pyr ) ;
cvRel easeI mage( &t gr ay ) ;
cvRel easeI mage( &t i mg ) ; */



/ / l i ber a l as i magenes t empor al es
cvRel easeI mage( &gr ay ) ;
cvRel easeI mage( &pyr ) ;
cvRel easeI mage( &t gr ay ) ;
cvRel easeI mage( &t i mg ) ;

r et ur n squar es;
}


/ / l a f unci on di buj a t odos l os cuadr ados en l a i magen
voi d dr awSquar es( I pl I mage* i mg, CvSeq* squar es )
{
CvSeqReader r eader ;
I pl I mage* cpy = cvCl oneI mage( i mg ) ;
i nt i ;

/ / i ni ci al i za el l ect or de secuenci a
cvSt ar t ReadSeq( squar es, &r eader , 0 ) ;
Tcnicas Digitales III Problema de ingeniera
31

/ / l ee 4 el ement os de secuenci a a l a vez ( t odos l os ver t i ces del cuadr ado)
f or ( i = 0; i < squar es- >t ot al ; i += 4 )
{
CvPoi nt pt [ 4] , *r ect = pt ;
i nt count = 4;

/ / l ee 4 ver t i ces
CV_READ_SEQ_ELEM( pt [ 0] , r eader ) ;
CV_READ_SEQ_ELEM( pt [ 1] , r eader ) ;
CV_READ_SEQ_ELEM( pt [ 2] , r eader ) ;
CV_READ_SEQ_ELEM( pt [ 3] , r eader ) ;

/ / di buj a el cuadr ado como una pol i gonal cer r ada
cvPol yLi ne( cpy, &r ect , &count , 1, 1, CV_RGB( 0, 255, 0) , 3, CV_AA, 0 ) ;

}/ / en CV_RGB( 255, 0, 0) , l a combi naci n de col or del cont or no( r oj o)

/ / muest r a l a i magen r esul t ant e
cvShowI mage( wndname, cpy ) ;
cvRel easeI mage( &cpy ) ;
}



/ / I magenes or i gi nal es del Pr ogr ama

/ *char * names[ ] = { " pi c1. png", " pi c2. png", " pi c3. png",
" pi c4. png", " pi c5. png", " pi c6. png", 0 }; */

/ / I magenes hachas por nosot r os par a l as pr uebas
char * names[ ] = { " Di buj o1. bmp" , "Di buj o2. bmp", " Di buj o3. bmp" ,
" Di buj o4. bmp" , "Di buj o5. bmp", " Di buj o6. bmp" , 0 };



/ / ################ Pr ogr ama Pr i nci pal ########################

i nt mai n( i nt ar gc, char ** ar gv)
{
i nt i , c;
/ / cr eat e memor y st or age t hat wi l l cont ai n al l t he dynami c dat a
st or age = cvCr eat eMemSt or age( 0) ;

f or ( i = 0; names[ i ] ! = 0; i ++ )
{
/ / car ga i - esi ma i magen
i mg0 = cvLoadI mage( names[ i ] , 1 ) ;
i f ( ! i mg0 )
{
pr i nt f ( "Coul dn' t l oad %s\ n" , names[ i ] ) ;
cont i nue;
}
i mg = cvCl oneI mage( i mg0 ) ;

/ / Cr ea una vent ana
cvNamedWi ndow( wndname, 1 ) ;

/ / l l amado a f unci on que di buj a cuadr ados
/ / dr awSquar es( i mg, f i ndSquar es4( i mg, st or age ) ) ;
dr awTr i angl es( i mg, f i ndTr i angl es4( i mg, st or age ) ) ;
Tcnicas Digitales III Problema de ingeniera
32
/ / esper a que se pr esi one una t ecl a
c = cvWai t Key( 0) ;
/ / l i ber a ambas i magenes
cvRel easeI mage( &i mg ) ;
cvRel easeI mage( &i mg0 ) ;
/ / l i mpi a el espaci o de memor i a - r eset ea posi ci on de espaci o l i br e
cvCl ear MemSt or age( st or age ) ;
i f ( ( char ) c == 27 )
br eak;
}

cvDest r oyWi ndow( wndname ) ;

r et ur n 0;
}



/ / ################ Funci n 5 ########################
/ / Est a f ue copi ada a l a ant er i or y modi f i cada par a t r at ar que
/ / det ect e t r i angul os

CvSeq* f i ndTr i angl es4( I pl I mage* i mg, CvMemSt or age* st or age )
{
CvSeq* cont our s;
i nt i , c, l , N = 11;
CvSi ze sz = cvSi ze( i mg- >wi dt h & - 2, i mg- >hei ght & - 2 ) ;
I pl I mage* t i mg = cvCl oneI mage( i mg ) ;
I pl I mage* gr ay = cvCr eat eI mage( sz, 8, 1 ) ;
I pl I mage* pyr = cvCr eat eI mage( cvSi ze( sz. wi dt h/ 2, sz. hei ght / 2) , 8, 3 ) ;
I pl I mage* t gr ay;
CvSeq* r esul t ;
doubl e s, t ;
/ / Cr ea una secuenci a vac a que cont endr punt os,
/ / 3 punt os por t r i ngul o ( l os vr t i ces del t r i ngul o)
CvSeq* t r i angl es = cvCr eat eSeq( 0, si zeof ( CvSeq) , si zeof ( CvPoi nt ) , st or age
) ;

cvSet I mageROI ( t i mg, cvRect ( 0, 0, sz. wi dt h, sz. hei ght ) ) ;

cvPyr Down( t i mg, pyr , 7 ) ;
cvPyr Up( pyr , t i mg, 7 ) ;
t gr ay = cvCr eat eI mage( sz, 8, 1 ) ;


f or ( c = 0; c < 3; c++ )
{
cvSet I mageCOI ( t i mg, c+1 ) ;
cvCopy( t i mg, t gr ay, 0 ) ;


f or ( l = 0; l < N; l ++ )
{

i f ( l == 0 )
{
cvCanny( t gr ay, gr ay, 0, t hr esh, 5 ) ;
cvDi l at e( gr ay, gr ay, 0, 1 ) ;
}
el se
{
Tcnicas Digitales III Problema de ingeniera
33
/ / t gr ay( x, y) = gr ay( x, y) < ( l +1) *255/ N ? 255 : 0
cvThr eshol d( t gr ay, gr ay, ( l +1) *255/ N, 255, CV_THRESH_BI NARY ) ;
}

cvFi ndCont our s( gr ay, st or age, &cont our s, si zeof ( CvCont our ) ,
CV_RETR_LI ST, CV_CHAI N_APPROX_SI MPLE, cvPoi nt ( 0, 0) ) ;

whi l e( cont our s )
{
r esul t = cvAppr oxPol y( cont our s, si zeof ( CvCont our ) , st or age,
CV_POLY_APPROX_DP, cvCont our Per i met er ( cont our s) *0. 02, 0 ) ;

/ / hubo pr obl emas con l as compar aci ones y f unci ones asoci adas
/ / par a l ogr ar que se l l egar a a un r esul t ado r azonabl e,
/ / en concl usi on no se l ogr an det ect ar cor r ect ament e l os ver t i ces
i f ( r esul t - >t ot al == 3 &&
f abs( cvCont our Ar ea( r esul t , CV_WHOLE_SEQ) ) > 1000 &&
cvCheckCont our Convexi t y( r esul t ) )
{
s = 0;

f or ( i = 0; i < 4; i ++ )
{
i f ( i >= 2 )
{
t = f abs( angl e(
( CvPoi nt *) cvGet SeqEl em( r esul t , i ) ,
( CvPoi nt *) cvGet SeqEl em( r esul t , i - 2 ) ,
( CvPoi nt *) cvGet SeqEl em( r esul t , i - 1 ) ) ) ;
s = s > t ? s : t ;
pr i nt f ( "Angl e: %l d %l d\ n" , t , s) ;
}
}


i f ( s < 0. 5 ) / / modi f i caci n, or i gi nal = 0. 3
/ *Si modi f i co el val or de compar aci n hago que mi s
angul os sean menor es q 90! ! ! */
f or ( i = 0; i < 3; i ++ )
cvSeqPush( t r i angl es,
( CvPoi nt *) cvGet SeqEl em( r esul t , i ) ) ;
}

cont our s = cont our s- >h_next ;
}
}
}
/ / Muest r a l as i mgenes AGREGADO

/ / cvShowI mage( *gr ay, 0 ) ;
/ *cvRel easeI mage( &pyr ) ;
cvRel easeI mage( &t gr ay ) ;
cvRel easeI mage( &t i mg ) ; */

cvRel easeI mage( &gr ay ) ;
cvRel easeI mage( &pyr ) ;
cvRel easeI mage( &t gr ay ) ;
cvRel easeI mage( &t i mg ) ;

r et ur n t r i angl es;
}
Tcnicas Digitales III Problema de ingeniera
34


/ / ##########################################################################
/ / Est a f unci on deber i a di buj ar l os t r i angul os encont r ados, per o hubo pr obl emas
/ / par a hacer l o como se debe
voi d dr awTr i angl es( I pl I mage* i mg, CvSeq* t r i angl es )
{
CvSeqReader r eader ;
I pl I mage* cpy = cvCl oneI mage( i mg ) ;
i nt i ;

cvSt ar t ReadSeq( t r i angl es, &r eader , 0 ) ;

f or ( i = 0; i < t r i angl es- >t ot al ; i += 3 )
{
CvPoi nt pt [ 3] , *t r i ang = pt ;
i nt count = 3;

/ / l ee 3 ver t i ces
CV_READ_SEQ_ELEM( pt [ 0] , r eader ) ;
CV_READ_SEQ_ELEM( pt [ 1] , r eader ) ;
CV_READ_SEQ_ELEM( pt [ 2] , r eader ) ;


/ / deber i a di buj ar t r i angul os como una pol i gonal cer r ada
cvPol yLi ne( cpy, &t r i ang, &count , 1, 1, CV_RGB( 0, 255, 0) , 3, CV_AA, 0 ) ;

}/ / en CV_RGB( 255, 0, 0) , l a combi naci n de col or del cont or no( r oj o)

/ / show t he r esul t ant i mage
cvShowI mage( wndname, cpy ) ;
cvRel easeI mage( &cpy ) ;
}
/ / ##########################################################################



























Tcnicas Digitales III Problema de ingeniera
35

Detector de Cuadrados. Salidas por Pantalla.


Programa original:
















Programa modificado:

Se puede notar que el programa modificado no detecta tringulos, sino cuadrilteros con ngulos
menores a 90. Otra caracterstica de estas salidas por pantalla que vale la pena mencionar es el
efecto indeseable del ruido en una imagen (Paralelogramo ficticio detectado!!!).























Tcnicas Digitales III Problema de ingeniera
36
Anexo 2 - Programa de Reconocimiento de Patrones


Archivo Main.c


/ ******************************************************
* Tecni cas Di gi t al es I I I *
* *
* Pr oyect o: Apl i caci n de l a Vi si n Ar t i f i ci al *
* a l a I dent i f i caci n de Fi gur as *
*******************************************************/

#i ncl ude <wi ndows. h>
#i ncl ude <st r i ng. h>
#i ncl ude <st di o. h>
#i ncl ude <mat h. h>

#i ncl ude "cv. h"
#i ncl ude "cvaux. h"
#i ncl ude "cxcor e. h"
#i ncl ude "hi ghgui . h"
#i ncl ude "Mai n. h"


#i f def _CH_
#pr agma package <opencv>
#endi f

#def i ne I DC_MAI N_TEXT 1001
#def i ne NUMERO 10

const char * ent ;
st at i c char g_szCl assName[ ] = "MyWi ndowCl ass";
st at i c HI NSTANCE g_hI nst = NULL;

i nt VARI ABLE;
I pl I mage* i mgr i s = 0;
I pl I mage* pat = 0;
I pl I mage* i mg_ = 0;
I pl I mage* i mg1 = 0;
i nt a=0, aux_ar ea=0;
i nt *cuent ae, *cuent ap=0;
f l oat r esul t ado=0;
unsi gned f l ag=0, ct r l ;
doubl e mi nVal , maxVal , mi n, max;
CvPoi nt mi nLoc, maxLoc, Loc;

const char * wndname0 = " Pat r on";
const char * wndname1 = " Ent r ada" ;
const char * wndname2 = " Resul t ado" ;
char * FI GURA;
char * t i popat r , t ampat r ;
i nt i =0, c, cont _gr upo=0, i mg_sel ect =0, of f set =0, pat r on=0;
f l oat r el _ar ea, r est a_ar ea;

WNDCLASSEX WndCl ass;
HWND hwnd;
Tcnicas Digitales III Problema de ingeniera
37
MSG Msg;

t ypedef st r uct st Dat os {
f l oat Numer o;
} DATOS;



/ * $$$$$$$$$$$ Decl ar aci on de Funci ones $$$$$$$$$$$$$$$ */

i nt ar eas( I pl I mage *i mg1, I pl I mage *i mg2, unsi gned ct r l , f l oat *r est a_ar ea, f l oat
*r el _ar ea) ;

i nt r econ_pat r on( I pl I mage* i mgr i s, I pl I mage* pat , const char * wndname2, doubl e
*mi n, doubl e *max, CvPoi nt *Loc) ;

i nt pr ocesam( char * ent , doubl e *max, doubl e *Loc, char * t i popat r , char * t ampat r ) ;


/ *#######################################################*/
LRESULT CALLBACK Wi ndowPr ocedur e ( HWND, UI NT, WPARAM, LPARAM) ;
BOOL CALLBACK Dl gPr oc( HWND, UI NT, WPARAM, LPARAM) ;
/ *#######################################################*/

BOOL LoadFi l e( HWND hEdi t , LPSTR pszFi l eName)
{

}


BOOL DoFi l eOpenSave( HWND hwnd, BOOL bSave)
{
st at i c HI NSTANCE hI nst ance;


OPENFI LENAME of n;
char szFi l eName[ MAX_PATH] ;

Zer oMemor y( &of n, si zeof ( of n) ) ;
szFi l eName[ 0] = 0;

of n. l St r uct Si ze = si zeof ( of n) ;
of n. hwndOwner = hwnd;
of n. l pst r Fi l t er = "Ar chi vos de I magenes ( *. bmp) \ 0*. bmp\ 0Todos l os Ar chi vos
( *. *) \ 0*. *\ 0\ 0";
of n. l pst r Fi l e = szFi l eName;
of n. nMaxFi l e = MAX_PATH;
of n. l pst r Def Ext = "bmp";

of n. Fl ags = OFN_EXPLORER | OFN_FI LEMUSTEXI ST | OFN_HI DEREADONLY;
i f ( Get OpenFi l eName( &of n) )
{
i f ( ! LoadFi l e( Get Dl gI t em( hwnd, I DC_MAI N_TEXT) , szFi l eName) )
{
MessageBox( hwnd, " Load of f i l e f ai l ed. " , "Er r or " ,
MB_OK | MB_I CONEXCLAMATI ON) ;
r et ur n FALSE;
}
}


Tcnicas Digitales III Problema de ingeniera
38
ent = of n. l pst r Fi l e;
pr ocesam( ent , &max, &maxLoc, &t i popat r , &t ampat r ) ;


r et ur n TRUE;
}

i nt WI NAPI Wi nMai n ( HI NSTANCE hThi sI nst ance, HI NSTANCE hPr evI nst ance, LPSTR
l pszAr gument , i nt nFunst er St i l )
{
HWND hwnd; / * Mani pul ador de vent ana */
MSG Msg; / * Msgs r eci bi dos por l a apl i caci n */
WNDCLASSEX wi ncl ; / * Est r uct ur a de dat os par a l a cl ase de vent ana */

/ * Est r uct ur a de l a vent ana */
wi ncl . hI nst ance = hThi sI nst ance;
wi ncl . l pszCl assName = " NUESTRA_CLASE" ;
wi ncl . l pf nWndPr oc = Wi ndowPr ocedur e; / * Est a f unci n es i nvocada por
Wi ndows */
wi ncl . st yl e = CS_DBLCLKS; / * Capt ur a l os dobl e- cl i cks */
wi ncl . cbSi ze = si zeof ( WNDCLASSEX) ;

/ * Usar i cono y punt er o por def ect or */
wi ncl . hI con = LoadI con ( NULL, I DI _APPLI CATI ON) ;
wi ncl . hI conSm= LoadI con ( NULL, I DI _APPLI CATI ON) ;
wi ncl . hCur sor = LoadCur sor ( NULL, I DC_ARROW) ;
wi ncl . l pszMenuName = "Menu" ;
wi ncl . cbCl sExt r a = 0; / * Si n i nf or maci n adi ci onal par a
l a vent ana*/
wi ncl . cbWndExt r a = 0; / * cl ase de l a vent ana */

/ * Usar el col or de f ondo por def ect o par a l a vent ana */
wi ncl . hbr Backgr ound = 1; / / Get SysCol or Br ush( COLOR_BACKGROUND) ;

/ * Regi st r ar l a cl ase de vent ana, si f al l a, sal i r del pr ogr ama */
i f ( ! Regi st er Cl assEx( &wi ncl ) ) r et ur n 0;

/ * La cl ase est r egi st r ada, cr ear l a vent ana */
hwnd = Cr eat eWi ndowEx(
0, / * Posi bi l i dades de var i aci n */
"NUESTRA_CLASE", / * Nombr e de l a cl ase */
"Tr at ami ent o Di gi t al de I mgenes. I dent i f i caci n de Fi gur as" ,
/ * Text o del t t ul o */
WS_OVERLAPPEDWI NDOW, / * Ti po por def ect o */
0, / * Wi ndows deci de l a posi ci n */
0, / * donde se col oca l a vent ana */
544, / * Ancho */
375, / * Al t o en pi xel s */
HWND_DESKTOP, / * La vent ana es hi j a del escr i t or i o */
NULL, / * Si n men */
hThi sI nst ance, / * Mani pul ador de i nst anci a */
NULL / * No hay dat os de cr eaci n de vent ana */
) ;

/ * Most r ar l a vent ana */
ShowWi ndow( hwnd, SW_SHOWDEFAULT) ;
Updat eWi ndow( hwnd) ;
/ * Bucl e de Msgs, se ej ecut a hast a que haya er r or o Get Message devuel va
FALSE */
whi l e( TRUE == Get Message( &Msg, NULL, 0, 0) )
{
Tcnicas Digitales III Problema de ingeniera
39
/ * Tr aduci r Msgs de t ecl as vi r t ual es a Msgs de car act er es */
Tr ansl at eMessage( &Msg) ;
/ * Envi ar Msg al pr ocedi mi ent o de vent ana */
Di spat chMessage( &Msg) ;
}

/ * Sal i r con val or de r et or no */
r et ur n Msg. wPar am;
}

/ * Est a f unci n es i nvocada por l a f unci n Di spat chMessage( ) */
LRESULT CALLBACK Wi ndowPr ocedur e( HWND hwnd, UI NT msg, WPARAM wPar am, LPARAM
l Par am)
{
st at i c HI NSTANCE hI nst ance;
st at i c DATOS Dat os;
char * st r ;

swi t ch ( msg) / * mani pul ador del Msg */
{
case WM_CREATE:
hI nst ance = ( ( LPCREATESTRUCT) l Par am) - >hI nst ance;
r et ur n 0;
br eak;

case WM_COMMAND:
swi t ch( LOWORD( wPar am) )
{

case CM_FI LE_OPEN:
DoFi l eOpenSave( hwnd, FALSE) ;
br eak;

case CM_FI LE_EXI T:
Post Message( hwnd, WM_CLOSE, 0, 0) ;
br eak;

case CM_NSTROS:
MessageBox( hwnd, "LI NA ANGGELI , Ber nar do\ nTI ZI , Fer nando\ nVERA,
Mar cos\ n" , " I NTEGRANTES" , MB_OK) ;
}
br eak;

case WM_CLOSE:
Dest r oyWi ndow( hwnd) ;
br eak;

case WM_DESTROY:
Post Qui t Message( 0) ;
br eak;

def aul t :
r et ur n Def Wi ndowPr oc( hwnd, msg, wPar am, l Par am) ;
}

r et ur n 0;
}

BOOL CALLBACK Dl gPr oc( HWND hDl g, UI NT msg, WPARAM wPar am, LPARAM l Par am)
{

Tcnicas Digitales III Problema de ingeniera
40
char t ext o[ 50] ;

swi t ch ( msg) / * mani pul ador del Msg */
{
case WM_I NI TDI ALOG:

spr i nt f ( t ext o, " %s\ n " , FI GURA) ;
Set Wi ndowText ( Get Dl gI t em( hDl g, I D_TEXTO) , t ext o) ;
spr i nt f ( t ext o, " Mxi mo: %f ", maxVal ) ;
Set Wi ndowText ( Get Dl gI t em( hDl g, I D_NUMERO) , t ext o) ;
spr i nt f ( t ext o, " Local i zaci n: X=%d , Y=%d", maxLoc, mi nLoc) ;
Set Wi ndowText ( Get Dl gI t em( hDl g, I D_NUMERO_2) , t ext o) ;
r et ur n FALSE;
case WM_COMMAND:
swi t ch( LOWORD( wPar am) ) {
case I DOK:
EndDi al og( hDl g, FALSE) ;
br eak;

}
r et ur n TRUE;
}
r et ur n FALSE;
}


i nt pr ocesam( char * ent , doubl e *max, doubl e *maxLoc, char * t i popat r , char *
t ampat r )
{

/ / ***********************************
char * names[ ] = { " Pat r on1_. bmp", " Pat r on2_. bmp", " Pat r on3_. bmp",
" Pat r on4_. bmp", "Pat r on1_chi co. bmp", " Pat r on2_chi co. bmp" ,
" Pat r on3_chi co. bmp" ,
" Pat r on4_chi co. bmp" , " Pat r on1_gr ande. bmp",
" Pat r on2_gr ande. bmp", " Pat r on3_gr ande. bmp",
" Pat r on4_gr ande. bmp", 0 };

i nt i =0, c, cont _gr upo=0, i mg_sel ect =0, of f set =0, pat r on=0;

st at i c HI NSTANCE hI nst ance;
st at i c DATOS Dat os;
/ / ***********************************


/ / ################ Pr ogr ama Pr i nci pal ########################

/ * Not a: el t amao de l a i magen de ent r ada debe ser de 320 x 240*/

/ *Car ga una i magen en escal a de gr i ses*/
i mgr i s = cvLoadI mage( ent , 0) ;
i f ( ! i mgr i s )
{
MessageBox( hwnd, " NO SE PUDO CARGAR LA I MAGEN DE ENTRADA\ nPOR
FAVOR VERI FI QUE SU UBI CACI ON" , "ERROR",
MB_OK | MB_I CONERROR) ;
exi t ( 0) ;
}

cvNamedWi ndow( wndname1, 1 ) ; / / Cr ea una vent ana
cvMoveWi ndow( wndname1, 468, 0) ; / / La l ocal i za ( nombr e, x, y)
Tcnicas Digitales III Problema de ingeniera
41
cvShowI mage( wndname1, i mgr i s) ; / / Muest r a l a i magen

I pl I mage *aux1=cvCl oneI mage( i mgr i s) ; / / Copi a l a i mg de ent en aux1

/ * LOOP par a det ect ar a que gr upo cor r esponde l a i magen de ent r ada */
/ * Nos def i ne el t amao de pat r on a ut i l i zar par a el RECONOCI MI ENTO*/

ct r l =0;
do
{
i mg_sel ect =i mg_sel ect + 1;

cont _gr upo=0;
i f ( i mg_sel ect ==2) of f set =4;
i f ( i mg_sel ect ==3) of f set =8;

f or ( i = 0; i <= 3; i ++ )
{
/ / Car ga l a i - si ma i magen
pat = cvLoadI mage( names[ ( i +of f set ) ] , 0 ) ;
i f ( ! pat )
{
MessageBox( hwnd, names[ ( i +of f set ) ] , " VERI FI QUE LA UBI CACI ON DE: ",
MB_OK | MB_I CONERROR) ;
exi t ( 0) ;
}

/ * Ll amado a f unci on que cal cul a l as ar eas */
ar eas( aux1, pat , ct r l , &r est a_ar ea, &r el _ar ea) ;

/ * Umbr al de r el aci on de ar eas */
i f ( ( r el _ar ea>0. 75) &&( r el _ar ea<5. 5) )
{
cont _gr upo = cont _gr upo + 1;
}

ct r l =1;
}
}
whi l e ( ( cont _gr upo <= 3) &&( i mg_sel ect ! =3) ) ;


i f ( cont _gr upo<4)
{
i mg_sel ect =0;
}
el se

/ / pr i nt f ( " \ n\ nGr upo a sel ecci onar : %d\ n\ n" , i mg_sel ect ) ;

/ * Ter mi na LOOP par a encont r ar gr upo. . . */

swi t ch( i mg_sel ect ) {
case 1:
{
/ / pr i nt f ( " Pat r on Nor mal \ n" ) ;
pat r on=1;
of f set =0;
br eak;
}
case 2:
Tcnicas Digitales III Problema de ingeniera
42
{
/ / pr i nt f ( " Pat r on Reduci do\ n" ) ;
pat r on=2;
of f set =4;
br eak;
}
case 3:
{
/ / pr i nt f ( " Pat r on Gr ande\ n" ) ;
pat r on=3;
of f set =8;
br eak;
}
}

f l ag=0;
i f ( cont _gr upo ==4)
/ / Par a asegur ar me que se cumpl i er on cond de ar ea
f or ( i = 0; i <= 3; i ++ )
{
/ / Car ga l a i - si ma i magen
pat = cvLoadI mage( names[ ( i +of f set ) ] , 0 ) ;
i f ( ! pat )
{
MessageBox( hwnd, names[ ( i +of f set ) ] , " VERI FI QUE LA UBI CACI ON DE: ",
MB_OK | MB_I CONERROR) ;
exi t ( 0) ;
}

/ / Muest r a i magen pat r on
cvNamedWi ndow( wndname0, 1 ) ;
cvMoveWi ndow( wndname0, 458, 270 ) ;
cvShowI mage( wndname0, pat ) ;

/ * LLAMADA A FUNCI ON RECONOCI MI ENTO DE PATRONES*/

r econ_pat r on( i mgr i s, pat , wndname2, &mi n, &max, &Loc) ;


i f ( maxVal > 0. 9 )
{
swi t ch( i ) {
case 0:
{
f l ag=1;
swi t ch( pat r on) {
case 1:
{
FI GURA = " PATRON NORMAL\ n\ nFI GURA CUADRADO";
br eak;
}
case 2:
{
FI GURA = "PATRON REDUCI DO\ n\ nFI GURA CUADRADO" ;
br eak;
}
case 3:
{
FI GURA = "PATRON GRANDE\ n\ nFI GURA CUADRADO" ;
br eak;
}
Tcnicas Digitales III Problema de ingeniera
43
} / / CI ERRO SWI TCH pat r on : )

br eak;
}



case 1:
{
f l ag=1;
swi t ch( pat r on) {
case 1:
{
FI GURA =" PATRON NORMAL\ n\ nFI GURA CI RCULO" ;
br eak;
}
case 2:
{
FI GURA =" PATRON REDUCI DO\ n\ nFI GURA CI RCULO" ;
br eak;
}
case 3:
{
FI GURA =" PATRON GRANDE\ n\ nFI GURA CI RCULO" ;
br eak;
}
} / / CI ERRO SWI TCH pat r on : )

br eak;
}
case 2:
{
f l ag=1;
swi t ch( pat r on) {
case 1:
{
FI GURA = "PATRON NORMAL\ n\ nFI GURA TRI ANGULO";
br eak;
}
case 2:
{
FI GURA = "PATRON REDUCI DO\ n\ nFI GURA TRI ANGULO";
br eak;
}
case 3:
{
FI GURA = "PATRON GRANDE\ n\ nFI GURA TRI ANGULO";
br eak;
}
} / / CI ERRO SWI TCH pat r on : )

br eak;
}
case 3:
{
/ / pr i nt f ( " Es Cr uz\ n" ) ;
f l ag=1;
swi t ch( pat r on) {
case 1:
{
FI GURA = "PATRON NORMAL\ n\ nFI GURA CRUZ" ;
Tcnicas Digitales III Problema de ingeniera
44
br eak;
}
case 2:
{
FI GURA = "PATRON REDUCI DO\ n\ nFI GURA CRUZ" ;
br eak;
}
case 3:
{
FI GURA = "PATRON GRANDE\ n\ nFI GURA CRUZ" ;
br eak;
}
} / / CI ERRO SWI TCH pat r on : )
br eak;
}
}/ / ci er r o swi t ch
} / / ci er r o i f


cvRel easeI mage( &pat ) ; / / l i ber a i magen pat r on

i f ( f l ag==1) br eak; / / Si ya l o det ect o SALE! ! !

} / / ci er r o FOR


el se
f or ( i = 3; i <= 11; i )
{
/ / Car ga l a i - si ma i magen
pat = cvLoadI mage( names[ i ] , 0 ) ;
i f ( ! pat )
{
MessageBox( hwnd, names[ i ] , " VERI FI QUE LA UBI CACI ON DE: ", MB_OK |
MB_I CONERROR) ;
exi t ( 0) ;
/ / cont i nue;
}

/ / Muest r a i magen pat r on
cvNamedWi ndow( wndname0, 1 ) ;
cvMoveWi ndow( wndname0, 458, 270 ) ;
cvShowI mage( wndname0, pat ) ;

/ * LLAMADA A FUNCI ON RECONOCI MI ENTO DE PATRONES*/

r econ_pat r on( i mgr i s, pat , wndname2, &mi n, &max, &Loc) ;


i f ( ( maxVal >0. 9) &&( i ==3) )
{
FI GURA = " PATRON NORMAL\ n\ nES CRUZ";
f l ag=1;
}
i f ( ( maxVal >0. 9) &&( i ==7) )
{
FI GURA = " PATRON REDUCI DO\ n\ nES CRUZ";
f l ag=1;
}
i f ( ( maxVal >0. 9) &&( i ==11) )
{
Tcnicas Digitales III Problema de ingeniera
45
FI GURA = " PATRON GRANDE\ n\ nES CRUZ";
f l ag=1;
}


cvRel easeI mage( &pat ) ; / / l i ber a i magen pat r on
i f ( f l ag==1) br eak; / / Si ya l o det ect o SALE! ! !

i =i +4;
} / / ci er r o FOR



i f ( f l ag==0)
{
FI GURA = " FI GURA NO COMPATI BLE\ n\ nNO SE PUEDE DETECTAR";
}

/ / #############################################################################
Di al ogBoxPar am( hI nst ance, " Di al ogoPr ueba" , hwnd, Dl gPr oc, ( LPARAM) &Dat os) ;
/ / #############################################################################

cvRel easeI mage( &i mgr i s ) ;
cvRel easeI mage( &i mg1 ) ;
cvDest r oyWi ndow( wndname0 ) ;
cvDest r oyWi ndow( wndname1 ) ;
cvDest r oyWi ndow( wndname2 ) ;
r et ur n 0;
}


i nt ar eas( I pl I mage *i mg1, I pl I mage *i mg2, unsi gned ct r l , f l oat *r est a_ar ea,
f l oat *r el _ar ea)
{
f l oat cuent ap=0, cuent ae=0;
I pl I mage *aux2=cvCl oneI mage( pat ) ;

/ * Hay que hacer una umbr al i zaci on par a poder cont ar pi xel es y
l uego compar ar l os di st i nt os t amaos de i magen de ent r ada*/

i f ( ct r l ==0)
{
/ / Umbr al i zaci on par a I magen de Ent r ada
cvThr eshol d( i mg1, i mg1, 200, 255, CV_THRESH_BI NARY_I NV ) ;
}
/ / Umbr al i zaci on par a I magen de Pat r on
cvThr eshol d( pat , aux2, 200, 255, CV_THRESH_BI NARY_I NV ) ;

/ *i nver t i mos l a i magen bi nar i a par a cont ar pi xel es bl ancos t omados como
" 1s"*/
/ ************* Cont ado de pi xel es bl ancos **************/
cuent ae = cvCount NonZer o( i mg1) ;
cuent ap = cvCount NonZer o( aux2) ;
*r est a_ar ea = ( cuent ae) - ( cuent ap) ;
*r el _ar ea = ( cuent ae) / ( cuent ap) ;
pr i nt f ( "\ nPi xel es negr os de l a i magen de ENTRADA: %f \ n\ n" , cuent ae) ;
pr i nt f ( "Pi xel es negr os de l a i magen PATRON: %f \ n\ n" , cuent ap) ;
/ / pr i nt f ( "Di f er enci a ent r e ar eas: %f \ n" , *r est a_ar ea ) ;
pr i nt f ( "Rel aci on ent r e ar eas: %f \ n\ n" , *r el _ar ea ) ;
/ *******************************************************/
cvRel easeI mage( &aux2 ) ;
Tcnicas Digitales III Problema de ingeniera
46
r et ur n( 0) ;
}


i nt r econ_pat r on( I pl I mage* i mgr i s, I pl I mage* pat , const char * wndname2, doubl e
*mi n, doubl e *max, CvPoi nt *Loc)
{

/ * ############## Compar a con un pat r on ###################*/
I pl I mage* map= cvCr eat eI mage( cvSi ze( i mgr i s- >wi dt h- pat - >wi dt h+1, i mgr i s- >
hei ght - pat - >hei ght +1) , I PL_DEPTH_32F, 1) ;
cvMat chTempl at e( i mgr i s, pat , map, CV_TM_CCOEFF_NORMED) ;
/ / Var i ant es, en est e f uent e se puede ut i l i zar sol o cor r el aci on, ya que,
/ / si se usar a cual q de l os ot r os no f unci onar i a l a t oma de deci si on
/ / CV_TM_SQDI FF_NORMED
/ / CV_TM_CCORR_NORMED
/ / CV_TM_CCOEFF_NORMED

cvNamedWi ndow( wndname2, 1 ) ;
cvMoveWi ndow( wndname2, 617, 270 ) ;
cvShowI mage( wndname2, map) ;
/ *#######################################################*/
/ *Saca l os max y mi n de l a i magen r esul t ado*/
cvMi nMaxLoc ( map, &mi nVal , &maxVal , &mi nLoc, &maxLoc, NULL) ;

/ / pr i nt f ( "Mi ni mo: %f \ n" , mi nVal ) ;
pr i nt f ( "Maxi mo: %f \ n" , maxVal ) ;

/ *Local i zaci ones del maxi mo*/
pr i nt f ( "Local i zaci on en mapa de r esul t ado ( x, y) :
( %d, %d) \ n\ n", maxLoc. x, maxLoc. y) ;
*mi n=mi nVal ;
*max=maxVal ;
*Loc=maxLoc;
cvRel easeI mage( &map ) ;
r et ur n( 0) ;
}



Archivo Main.h


#def i ne CM_FI LE_EXI T 9071
#def i ne CM_FI LE_OPEN 9070
#def i ne CM_NSTROS 9069

/ * I dent i f i cador es de di l ogo */
#def i ne I D_NUMERO 100
#def i ne I D_NUMERO_2 102
#def i ne I D_TEXTO 103



Archivo Main.rc


#i ncl ude <wi ndows. h>
#i ncl ude "Mai n. h"


Tcnicas Digitales III Problema de ingeniera
47
Menu MENU
{
POPUP "&ARCHI VO"
{
MENUI TEM "&ABRI R FI GURA DE ENTRADA. . . ", CM_FI LE_OPEN
MENUI TEM SEPARATOR
MENUI TEM "E&xi t ", CM_FI LE_EXI T
}
POPUP "&NOSOTROS"
{
MENUI TEM "&I NTEGRANTES. . . ", CM_NSTROS
}
}

Di al ogoPr ueba DI ALOG 0, 0, 120, 120
STYLE DS_MODALFRAME | WS_POPUP | WS_VI SI BLE | WS_CAPTI ON
CAPTI ON " Resul t ados del Anl i si s"
FONT 8, " Hel p"
{

CONTROL "" , I D_TEXTO, "STATI C" ,
SS_CENTER | WS_CHI LD | WS_VI SI BLE,
8, 9, 100, 40

CONTROL "" , I D_NUMERO, " STATI C",
ES_NUMBER | ES_LEFT | WS_CHI LD | WS_VI SI BLE / *| WS_BORDER | WS_TABSTOP*/ ,
8, 60, 100, 20 / / col , f i l a, ancho, al t o

CONTROL "" , I D_NUMERO_2, " STATI C",
ES_NUMBER | ES_LEFT | WS_CHI LD | WS_VI SI BLE / *| WS_BORDER | WS_TABSTOP*/ ,
8, 70, 100, 20


CONTROL "Acept ar ", I DOK, " BUTTON",
BS_DEFPUSHBUTTON | BS_CENTER | WS_CHI LD | WS_VI SI BLE | WS_TABSTOP,
32, 100, 52, 14

}















Tcnicas Digitales III Problema de ingeniera
48

Reconocimiento de Patrones. Salida por Pantalla.