miércoles, 21 de enero de 2009

Resultados con video

Para el reconocimiento de placas colombianas en video se utilizo el siguiente código
close all;
clear all;
clc

%my_movie_info = aviinfo('carrote (11).avi')
videoObject = mmreader('carrote.wmv');
tic
for i=1:3;%my_movie_info.NumFrames;
mov= read( videoObject, [i] );
ENSAYO(mov);

end
toc

La función aviinfo e utilizo para extraer toda la información del video
Con esta información se puede saber el número de frames por segundo y el número de frames que nos servirá para determinar cuantos frames queremos enviar para que sean tratados por el código de reconocimiento.
En nuestro caso se necesitan enviar pocos frames ya que el video es del mismo carro por lo tanto el numero de la placa no va a cambiar y con solo analizar pocas secuencias de imágenes de video se sabrá el numero de la placa.
El programa es capaz de reconocer cualquier tipo de imagen pero bajo ciertas condiciones, las cuales deben tenerse encuentra también cuando se trabaja con video.
Las consideraciones que se deben tener son las siguientes
Máxima distancia del foco de la cámara al vehículo es de 2 mts.
Mínima distancia del foco de la cámara al vehículo es de 0.5 mts
La posición de la cámara con respecto al vehículo puede colocarse frente a este o a un lado. En el caso de ubicar la cámara a un costado, el ángulo entre la posición de la cámara con respecto al vehículo no debe ser mayor a 40º
Por lo tanto se trabajo con videos que no excedieran el metro de distancia y con una posición casi frontal al vehículo para evitar problemas de ángulos y distancias.
Los frames que se envían son tratados como imágenes y se sigue el mismo tratamiento con los mismos códigos que se utilizaron cuando se trabajo con el banco de imágenes

PROBLEMAS PRESENTADOS
Los problemas presentados al trabajar con video fueron:
Al extraer los frames de video al código de extracción de la placa se debe tener encuentra que cada frame debe tener un tamaño aproximado de 1280 x 1024 y en nuestro código cada frame es enviado de 640 x 480 por lo tanto se debe primer ampliar la imagen para que se aproxime al tamaño deseado para poder empezar a extraer el rectángulo que contiene la placa.
Cuando se toma un video en donde el vehículo empieza con una posición en donde el ángulo de la palca es muy grande excediendo el permitido, o cuando en el video en su reproducción pone el carro en una posición en donde el ángulo de la placa excede el permitido, el programa no reconocerá la placa en el frame y se detendrá la extracción de la placa y el reconocimiento
Para usar la función aviinfo se necesita que los videos estén en formato. avi, y para la función mmreader se necesita que los videos estén en formato wmv, garantizando esto se obtiene que el programa funcione correctamente.
RESULTADOS OBTENIDOS
Los resultados que se obtuvieron al usar el video fueron básicamente los mismos que al utilizar las imágenes, porque cuando el video se trata como una secuencia de imágenes, se procesa cada imagen como si fuera una sola, y en cada una se trata de reconocer la placa.
El video es tratado como una secuencia de frames y cada uno de estos es enviado al código que solo trataba con imágenes para el reconocimiento.
Se tomo un video corto saco cada frame del video para ser enviado al código antigo para el reconocimiento.
La secuencia de imágenes del video son las siguientes:


Los resultados obtenidos en el procesamiento de cada imagen sonPara encontrar la placa dentro de la imagen se utiliza el mismo código antes descrito, así mismo como todos los códigos descritos anteriormente



Obteniéndose el resultado final del numero de la placa y el tiempo de computo del procesamiento


a continuacion se muestra el video con el que se trabajo y dos vidos mas para el reconocimiento de la placa

martes, 20 de enero de 2009

DISEÑO DEL SISTEMA Y RESULTADOS

DISEÑO DEL SISTEMA Y RESULTADOS:

El programa de reconocimiento de placas de vehículos “ENSAYO”, se realizó en Matlab 7.1 y se utilizaron algunos algoritmos de procesamiento digital de imágenes incluidos en Matlab’s Image Processing Toolbox v 4.2.

%ENSAYO.m
close all
clear all
clc

%LECTURA DE IMAGEN

I= imread('car (29).jpg');
ImPlaca = DetePlacaHough(I);
if ImPlaca == 0
error('no se encontro la placa')
end

%SEGMENTACION

placa = ImPlaca;
angle = angulo(placa);%calculo del angulo de inclinacion
placares = restauracion2(placa, angle);
placabw = umbralizacion(placares);
%garantiza que el contenido de 6 caracteres
placa = filtrado2(placabw);
%funcion que separa los caracteres por componentes conec
caracterres = separaCarateres(placa);


%RECONOCIMIENTO

CaracPro = zonificacion(caracterres);%Zonificación, vector de caracteristicas
NumeroPlaca = reconocimiento(CaracPro)

IMAGEN DE ENTRADA:
Lectura de una imagen desde un banco de imágenes.
%LECTURA DE IMAGEN
I= imread('car (29).jpg');




LOCALIZACION DE LA PLACA DENTRO DE LA IMAGEN
Para localizar la placa del vehículo dentro de la imagen, primeramente se pasa la imagen original a escala de grises y se recorta tanto vertical como horizontalmente porque se supone que la placa se encuentra ubicada en el centro de la imagen.
%Funcion principal que encuentra las coordenadas de la placa; utilizando
%la transformada de Hough
function Irec = DetePlacaHough(I)
Ig=I(:,:,1); % para obtener una sola matrix de la imagen
%[alto ancho] = size(I)
%I = I(380:(alto-300), 380:(alto-200));
[alto ancho] = size(Ig); % se recorta la placa suponiendo que la placa se
%encuentra en el centro
VeCorte = ceil([ancho*0.20 alto*0.23 ancho*0.61 alto*0.55]);
I = imcrop(Ig, VeCorte);
Ir=imresize(I,0.6); %[280 280 alto-200 (alto-400)]
% se redimenciona la 60%



Para la detección de bordes se utilizó el método de canny y se identificaron las líneas verticales del contorno de la placa mediante un filtro.
%METODO DE EDGE CANNY
It= edge(Ir, 'canny',[0.1 0.5],0.6); %deteccion de bordes con Canny
%PARA LAS LINEAS VERTICALES APLICANDO UN FILTRO
h = [-1 1];
I = imfilter(It,h);
I = bwareaopen(I,20); % Se eliminan pequeños fragmentos
I = I(6:end-6,6:end-6);% para evitar posibles lineas en los limites de la imagen


iMAGEN 3





Mediante la transformada de se Hough se localizaron con precisión las coordenadas de las líneas que conforman el contorno de la placa y poder extraer en otra imagen solamente el área que se requiere.


numsearch = 0;
%contador de el numero de busquedas, cambiando de detector de bordes
done = false;
while ~ done
[h theta,rho]=houghmv(I,1,1);
[r,c] = houghpeaksm(h,4);
% h:transformada de hough, 4 val: numero de picos
linesv = houghlinesm(I, theta, rho, r,c , 20, 6);
% r , c son las coordendas
% de las filas, columnas de los picos identificadso
[lvp] = findlines(linesv);
%posicion de la estructura linesv donde se encuentran las lines verticales
%se ncuentra la longitud de la placa para calcular la relacion ancho
%alto, utilizando los puntos inicial y final de las lineas encontradas,
%donde lvp.lin contiene los pares de las posibles lineas verticales
c1 = ceil(linesv(lvp(1).lin(1)).point2(1));%
c2 = ceil(linesv(lvp(1).lin(1)).point1(1));
c3 = min(ceil(linesv(lvp(1).lin(1)).point1(2)),ceil(linesv(lvp(1).lin(1)).point2(2)));
c4 = max(ceil(linesv(lvp(1).lin(2)).point1(2)),ceil(linesv(lvp(1).lin(2)).point2(2)));
% si los puntos vienen invertidos se corrigen
if c1 > c2
ctem = c1;
c1 = c2;
c2 = ctem;
end
if c4 > c3
ctem = c3;
c3 = c4;
c4 = ctem;
end
% si cumple con la relacion ancho/alto finaliza la busqueda
if ((c3-c4)/(c2-c1) <= 1.2*(165/70)) & ((c3-c4)/(c2-c1) >= 0.75*(165/70));
done = true;
Irec = Ir(c1-30:c2+37,c4-5:c3+5);% se recorta la placa
%Irec = Ig(c1:c2,c4:c3);
numsearch == inf;
else
% si no cumple con la relacion se utiliza otra tecnica para la
%deteccón de bordes y se hace la busqueda nuevamente
if numsearch ==5
% si el numero de busquedas es 4 se finaliza con fracaso en la busqueda
error('placa no detectada')
numsearch == inf;
end

%++ DETECTORES DE BORDES ++
if numsearch == 4;
numsearch = numsearch + 1;
I = I(8:end-8,8:end-8);
I= edge(Ig, 'canny');
I = bwareaopen(I,20);
h = [-1 1];
I = imfilter(I,h);
I = bwareaopen(I,20);
I = I(8:end-8,8:end-8);
end

if numsearch == 3;
numsearch = numsearch + 1;
I = bordes(Ig);
I = bwareaopen(I,20);
h = [-1 1];
I = imfilter(I,h);
I = bwareaopen(I,20);
I = I(4:end-4,4:end-4);
end
if numsearch == 2;
numsearch = numsearch + 1;
I = edge(Ig, 'sobel',[],'vertical');% utilizando sobel
I = bwareaopen(I,20);
I = I(15:end-15,15:end-15);
end
if numsearch == 1;
numsearch = numsearch + 1;
%Ig=fliplr(Ig);
I = bordes(Ig);
I = bwareaopen(I,20);
I = I(10:end-10,10:end-10);
end
if numsearch == 0;
numsearch = numsearch + 1;
end
end
end
end







PREPROCESAMIENTO DE IMAGENES:

%Funcion que corrige la imagen de la placa de acuerdo al angulo de
%inclinacion, recibido en angulo
%Entrada: imagen de la placa, y el angulo de inclinación
%Salida: imagen de la placa corregida
function placa = restauracion2(placa , angulo)
[m n] = size(placa);
%n: ancho; m: alto angulo
switch angulo
case {2,88}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 1*n 0.0198*m; 0.0194*n 0.89*m; n m];

case {3,4,87,86}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.98*n 0.0598*m; 0.0394*n 0.83*m; n m];

case {5,85}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.07*m; 0.04*n 0.83*m; n m];

case {6,84}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.03*m; 0.02*n 0.9*m; n m];

case {7,83}
puntosbase = [10 1; n 1; 1 m; n m];
puntosentrada = [1 1;0.99*n 0.12*m; 0.025*n 0.8*m; n m];

case {8,9,80,82}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.13*m; 0.03*n 0.78*m; n m];

case {9,10,11,79,80,81}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.18*m; 0.03*n 0.71*m; n m];

case {12,13,14,15,16,75,76,77,78}
puntosbase = [1 1; n 1; 1 m-10; n m-10];
puntosentrada = [1 1; 0.99*n 0.20*m; 0.057*n 0.72*m; n m];

otherwise

return;
end
tform = cp2tform(puntosentrada, puntosbase, 'projective');placa = imtransform(placa, tform, 'xdata', [1 n], 'ydata', [1 m], 'size',size(placa), 'fill', 128);




IMAGEN 5





SEGMENTACION:
Programa que digitaliza la imagen y detecta seis objetos mediante la técnica de análisis de componentes conectados.

%funcion que encuentra y separa los caracateres utilizando etiquetado de
%componetes conectados
function caracNor = separaCarateres(placa)
placa = ~placa;
[bwEtiq caraEncon] = bwlabel(placa);
carac = cell(1,6);
carac(1) = {bwEtiq == 1};
carac(2) = {bwEtiq == 2};
carac(3) = {bwEtiq == 3};
carac(4) = {bwEtiq == 4};
carac(5) = {bwEtiq == 5};
carac(6) = {bwEtiq == 6};

for g = 1:6
[I,J] = find(carac{g} == 1);
carac{g} = carac{g}(min(I):max(I),min(J):max(J));
if g==6
[alto ancho] = size(carac{g});
if alto/ancho < sumhoriz =" sum(carac{g});" posbus =" ceil(alto/2);" vectbus =" sumHoriz(PosBus:end);" i="1:length(VectBus)-5"> 6
carac{g} = carac{g}(:,1:PosBus+i);
break
end
end
end
end

caracNor{g} = imresize(carac{g},[60,25],'bilinear');
caracNor{g} = ~bwareaopen(~caracNor{g},14);
end




IMAGEN 6





RECONOCIEMTO:
Este programa realiza el reconocimiento de cada objeto y lo representa como carácter en la ventana de comandos de Matlab.

function NumeroPlaca = reconocimiento(CaracPro)
for i = 1:6
carac = CaracPro{i};
try
ia=i;
load thetaexper
%contiene los datos de los vectores de caracteristicas de letras ya aprendidos
ThetaLetra=thetaexper;
load thetaexpernume
%contiene los datos de los vectores de caracteristicas de letras ya aprendidos
ThetaNume=thetaexpernume;
i=ia;
catch
end
LetNum = VecinoHo(carac,i,ThetaLetra,ThetaNume);
%calculo del vecino

if i > 3
if LetNum == 10
LetNum = 0;
end
end

if i < letn =" char(LetNum*90);" letn =" char(65+" letn =" char(49+" letn =" char(48">


EXPLICACION DE LA SOLUCION AL PROBLEMA

EXPLICACION DE LA SOLUCION:

Para efectuar un adecuado reconocimiento de placas de vehículos mediante el procesamiento digital de imágenes, se aplicarán las técnicas conocidas de adquisición de imágenes y los múltiples algoritmos del Matlab’s Image Processing Toolbox v 4.2 que Matlab incluye en su programa.

Para obtener una imagen adecuada, en la adquisición de imágenes se tendrán en cuenta características como: distancia de la captura de la imagen y posición de cámara con respecto al vehículo.

En cuanto al tratamiento de la imagen para el análisis de características e identificación y reconocimiento de la placa, se aprovecha la forma y medidas específicas que tienen las placas para hacer una localización detallada de ésta en la imagen fuente. Este proceso se ha dividido en las siguientes etapas:

IMAGEN DE ENTRADA:
Se cuenta con un banco de imágenes de 235 fotografías de vehículos colombianos de diferentes colores y tamaños donde se encuentra localizada la placa.
LOCALIZACION DE LA PLACA DENTRO DE LA IMAGEN
Se hace un acondicionamiento de la imagen original para generar una nueva imagen donde se encuentre ubicada de forma específica la placa del vehículo.
Este proceso se hace ajustando la nueva imagen a un porcentaje de ubicación de la placa dentro de la imagen (0.2, 0.8), se aumenta la intensidad mediante umbralización y se detectan bordes mediante la función de edge('canny'), utilizando el método de canny.
Se aplica un filtro para eliminar las líneas horizontales y poder ubicar las coordenadas del inicio y final de los bordes de la placa.
PREPROCESAMIENTO DE IMAGENES:
Para reducir los errores en el reconocimiento de la placa, se hace un tratamiento de la nueva imagen en escala de grises y se corrigen algunos detalles como el ángulo de la placa en la nueva imagen.
Se aplica un segundo filtro para eliminar el ruido existente en la imagen como manchas, tornillos y agujeros entre otros que limitan el proceso de segmentación.
SEGMENTACION:
En esta fase se digitaliza la imagen y se procede a la detección de objetos mediante la técnica de análisis de componentes conectados y su respectivo etiquetado utilizando conectividad de 8.
RECONOCIEMTO:
Una vez que se hayan segmentado los caracteres mediante un vector de características, se procede a realizar el reconocimiento. En esta fase se utilizará el algoritmo del vecino más cercano holográfico, y se procede a presentar el resultado en la ventana de comandos de Matlab.

lunes, 19 de enero de 2009

ESTADO DEL ARTE

ESTADO DEL ARTE

PROCESAMIENTO DIGITAL DE IMAGENES

Son muchas las aplicaciones que se vienen adelantando con el procesamiento digital de imágenes, en nuestro caso de estudio trataremos el reconocimiento de placas de vehículos colombianos, donde se utilizaran las funciones de adquisición y análisis de imágenes por computador.

Adquisición de Imágenes:
- Iluminación.
- Sensor + Optica.
- Digitalizador.

Análisis de las imágenes:
- Preprocesado.
- Segmentación.
- Reconocimiento.

Para la adquisición de imágenes se debe tener en cuenta la selección de una buena cámara o sensor, iluminar la escena adecuadamente y contar con una memoria o disco duro donde se puedan almacenar todas las imágenes digitalizadas para proceder al análisis de la imagen. [1]

En cuanto al análisis de imágenes las técnicas utilizadas son las siguientes:

Preprocesamiento:
Acondicionamiento de la imagen Representación gráfica de las frecuencias relativas con las que aparecen los distintos niveles de grises en una imagen determinada. El histograma proporciona información sobre el brillo y el contraste de la imagen, y puede ser utilizado para ajustar estos parámetros o poder eliminar ciertas tonalidades molestas o ruido en la imagen. [2]

Segmentación:
Para realizar una segmentación adecuada, se utilizan diferentes algoritmos que permiten la detección de bordes mediante operadores como: Operador de Roberts, Operador de Sobel, Operador de Prewitt, Operador laplaciano, Detector de bordes de Canny. [2]
De acuerdo a las características de la imagen y la aplicación de alguna de éstas técnicas, permite reducir el campo de acción dentro de la imagen y ubicar de manera más sencilla los objetos deseados, utilizando métodos como etiquetado de componentes conectados, picos y valles entre otros. [2]

Reconocimiento:
Después de tener los objetos seleccionados, se procede al reconocimiento que se realiza mediante la ejecución de algoritmos diseñados para tal fin como: Fuzzy ARTMAP que es un modelo de red neuronal dinámica, El vecino más cercano holográfico que está basado en los principios de Memoria Asociativa Holográfica (MAH), red multicapa feedforward usada con el algoritmo backpropagation y comparación de plantillas entre otras técnicas de reconocimiento.[2]

REFERENCIA BIBLIOGRAFICA

[1] Fases de un S.V.A., Etapas de un SVA.pdf
Ultima consulta Diciembre 2008.

[2] Preprocesado de imágenes, Monografia placas veh.pdf
Ultima consulta Diciembre 2008.

[3] Segmentación, Preprocesamiento_imagenes R Molina.pdf
Ultima consulta Diciembre 2008.

jueves, 15 de enero de 2009

Requerimientos

REQUERIMIENTOS
Para el reconocimiento de la placa de un vehículo colombiano mediante el procesamiento digital de imágenes, se han propuesto tres prototipos en los cuales se deben cumplir los siguientes requerimientos:
Requerimientos del primer prototipo:
1. Identificar la placa de un vehículo colombiano a partir de una fotografía en formato digital, utilizando el programa Matlab o LabView.
2. La fotografía debe escogerse desde un banco de imágenes con 50 imágenes como mínimo.
3. La imagen del vehículo en la fotografía digital, debe haberse tomado a una distancia mínima de 0.5 metros y una distancia máxima de 2 metros entre el foco de la cámara y el vehículo. La posición de la cámara con respecto al vehículo no debe sobrepasar un ángulo de 40 grados.
4. El resultado de la identificación de la placa del vehículo debe ser presentada en la ventana principal de la aplicación mediante seis (6) caracteres: Los tres primeros corresponden a letras mayúsculas del alfabeto castellano y los tres últimos corresponden a números entre el cero (0) y el nueve (9).
Requerimientos del segundo prototipo:
1. Identificar la placa de un vehículo colombiano a partir de un video en formato digital, utilizando el programa Matlab o LabView.
2. El video debe escogerse desde un banco de videos con 50 videos como mínimo.
3. El video debe haberse capturado mediante una cámara con posición fija cuya distancia debe oscilar entre 0.5 metros y 2 metros entre el foco de la cámara y el vehículo. La posición de la cámara con respecto al vehículo no debe sobrepasar un ángulo de 40 grados.
4. El vehículo debe desplazarse con una velocidad entre cero y 15 kilómetros por hora.
5. La duración del video debe oscilar entre 3 y 5 segundos.
6. El resultado de la identificación de la placa del vehículo debe ser presentada en la ventana principal de la aplicación mediante seis (6) caracteres: Los tres primeros corresponden a letras mayúsculas del alfabeto castellano y los tres últimos corresponden a números entre el cero (0) y el nueve (9).
Requerimientos del tercer prototipo:
1. Identificar la placa de un vehículo colombiano a partir de una señal de video permanente en formato digital, utilizando el programa Open-CV.
2. El video debe capturarse mediante una cámara con posición fija cuya distancia debe oscilar entre 0.5 metros y 2 metros entre el foco de la cámara y el vehículo. La posición de la cámara con respecto al vehículo no debe sobrepasar un ángulo de 40 grados.
3. El programa debe detectar la presencia de un vehículo y proceder a la identificación de la placa.
4. El vehículo debe desplazarse con una velocidad entre cero y 15 kilómetros por hora.
5. El resultado de la identificación de la placa del vehículo debe ser presentada en la ventana principal de la aplicación mediante seis (6) caracteres: Los tres primeros corresponden a letras mayúsculas del alfabeto castellano y los tres últimos corresponden a números entre el cero (0) y el nueve (9).