viernes, 12 de diciembre de 2008

Alternativa 1: Momentos hu

Momentos hu:


Utilizando los momentos de hu se hizo una caracterizacion de las imagenes para tres comandos. El script utilizado fue descargado de la pagina http://dmery.ing.puc.cl/dmery/dmery/docencia/patrones/matlab/MomentosHu.zip.



El programa utilizado para hacer el analisis de los momentos de hu consiste de un procesamiento inicial de la imagen tal como se mostro en entradas anterioes del blog.



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear all;


Matriz para almacenar los momentos de las 12 imagenes, es decir, 4 imagenes por comando.

Z = zeros(12,8);

Abre cada una de las imagenes.

for i=1:4
string = ['F:\Cder1\bien\der\' num2str(i) '.jpg'];

Procesamiento.
Ima=imread(string);
I=rgb2gray(Ima);
%figure(i), imshow(I);
%%
%K = imadjust(I,[0.5 1],[]);
K = imadjust(I);
%K =medfilt2(I,[3 3]);
%figure, imshow(K);
%%
JU = im2bw(K,0.55);
%level = graythresh(K);
%JU = im2bw(K,level);
%figure, imshow(JU)
%%
se = strel('disk',9);
bw2 = imclose(JU,se);
bw3 = imopen(bw2,se);
figure, imshow(bw3)
%imshow(R);
Cálculo de los momentos de Hu.

HM = HuMom(bw3);
Z(i,:) = [HM 1];
Z
end

Los resultados se despliegna en una grafica de dos dimensiones x-y, donde en cada eje se grafica un momento. Analizando cual par (Momento x,Momento y) es el mas adecuado, para hacer la clasificacion de los comandos en el espacio 2-dimensional.

%%%%%%%%%%%%%%%%%%%%%%%
k1 = find(Z(:,8)==1);
k2 = find(Z(:,8)==2);
k3 = find(Z(:,8)==3);
figure(3)
%x=2;y=4 da buenos resultados
while(1)
x = input('Momento de Hu eje x?')
y = input('Momento de Hu eje y?')
clf
plot(Z(k1,x),Z(k1,y),'r*')
hold on
plot(Z(k2,x),Z(k2,y),'g+')
plot(Z(k3,x),Z(k3,y),'bo')
end



Tomando x=3; y=3. Los resultados se muestran en la figura, dond epuede verse una distribuciòn que facilita la clasificación de los comandos:






Tomando x=5,y=5, los resultados se muestran en la figura inferior, Aqui la distribucion de los momentos complica la clasificacion, por tanto ha de ser desechada:



El paso siguiente al analisis, es el entrenamiento de una red neuronal.

jueves, 11 de diciembre de 2008

¿Como Posicionar el Puntero?

El objetivo de proyecto es posicionar el puntero de mouse con los comandos clasificados de las capturas con la Web cam, a continuacion se muestran los Links de algunos algoritmos utilizados que se encontraron la web.


La opcion que mas se acerca a nuestro proyecto es la de usar la libreria de WINDOWS llamada USER32.DLL, esta libreria nos proporciona y fija la posicion del puntero del mouse "al menos en teoria", el evento mouse_event se puede generar para fijar la posicion del mouse a nuestro gusto.

El siguiente link muestra la descripcion de este evento y todos sus parametros
http://winapi.conclase.net/curso/index.php?fun=mouse_event

Es una buena posibilidad para controlar la pisicion del puntero

miércoles, 10 de diciembre de 2008

IMPLEMENTACIÓN

Los algoritmos serán probados inicialmente en el entorno MATLAB el cual cuenta con un set de funciones para el procesamiento digital de imagen y video, con la ventaja de poder encontrar referencias y ejemplos de procesamiento en esta herramienta, Se presentaran los algoritmos utilizados los cuales contienen los comentarios pertinentes acerca de las funciones utilizadas, por simplicidad se explicaran algunos de los comandos utilizados pero puedes bajar los archivos del siguiente link

Lectura de la imagen.

%% Lectura de la imagen desde archivo
tic
I = imread('1.jpg'); % carga imagen en la variable I
figure, imshow(I); % muestra la imagen
I=rgb2gray(I); % Conversion RGB a gray
figure, imshow(K);


Apertura y cierre

%% Apertura y cierre
se = strel('disk',3); % Crea un elemento estructurante "Disco de 3*3"
bw2 = imclose(JU,se); % Closing de la imagenbw3 = imopen(bw2,se); % Opening de la imagen
Transformada de hough y dibujado de las lineas
%% transformada de hough
[H,Theta,Rho] = hough(SK);
P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(SK,Theta,Rho,P);

lenlines=1:1:length(lines);
max_len = 0;
largolines = length(lines);
valory = zeros(1,(largolines*2));
valorx = zeros(1,(largolines*2));
for k = 1:largolines

valory(k) = lines(k).point1(2);
valory(k+largolines) = lines(k).point2(2);

valorx(k) = lines(k).point1(1);
valorx(k+largolines) = lines(k).point2(1);

xy = [lines(k).point1; lines(k).point2];
%plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
%plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
%plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
%message = sprintf('Ang=%2.3f leng=%2.3f',lines(k).theta,len);
%text(15,15+10*k,message,'Color','y','FontWeight','bold');
lenlines(k)=len;
%angulo(k) = lines(k).theta*pi/180;End





Transformada de hough y dibujado de las lineas

%% transformada de hough
[H,Theta,Rho] = hough(SK);
P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(SK,Theta,Rho,P);
lenlines=1:1:length(lines);
max_len = 0;
largolines = length(lines);
for k = 1:largolines
valory(k) = lines(k).point1(2);
valory(k+largolines) = lines(k).point2(2);
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
message = sprintf('Ang=%2.3f leng=%2.3f',lines(k).theta,len);
text(15,15+10*k,message,'Color','y','FontWeight','bold');
lenlines(k)=len;
angulo(k) = lines(k).theta*pi/180;
end

Características extraídas del tratamiento de imágenes

click derecho

línea con punto xy cuya coordenada y es la mayor, y coordenadas x a la derecha del centro de masa.

click izquierdo

línea con punto xy cuya coordenada y es la mayor, y coordenadas x a la izquierda del centro de masa.


doble click derecho

línea con punto xy cuya coordenada y es la mayor, y coordenadas x a la izquierda del centro de masa. Punto x mas alejado a la derecha.

Los resultados obtenidos fueron satisfactorios hasta cierto punto ya que se logro calcular las líneas de Hough pero estas presentan mucha complejidad a la hora de realizar la caracterización ya este método seria sensible a escalamiento, por tanto se opta por realizar el algoritmo con la segunda alternativa que son los momentos de Hu, en seguida se explica el algoritmo utilizado para esta alternativa

Momentos de Hu


El algoritmo utilizado para los momentos de Hu fue encontrado en la siguiente página.

http://dmery.ing.puc.cl/dmery/dmery/docencia/patrones/matlab/MomentosHu.zip
Donde Se encuentran algunos ejemplos elaborados en MATLAB sobre procesamiento digital de imágenes.

Este algoritmo calcula los siete momentos de Hu a una imagen ya procesada y recibe como parámetros la imagen segmentada, ósea la matriz de etiquetas de la imagen.
Nuestro procesamiento lo pueden descargar del siguiente linK


Descripción.



Antes de calcular los momentos de Hu se debe realizar la segmentación de la imagen.

[L,n] = bwlabel(bw3,4); % Matriz de etiquetas L
HM = HuMom(L); % Calculo de los momentos de Hu


Los resultados se despliegan en una grafica de dos dimensiones x-y, donde en cada eje se grafica un momento. Analizando cual par (Momento x,Momento y) es el mas adecuado, para hacer la clasificación de los comandos en el espacio 2-dimensional.

x = input('Momento de Hu eje x?');
y = input('Momento de Hu eje y?');
clf
plot(Z(k1,x),Z(k1,y),'r*')
hold on
plot(Z(k2,x),Z(k2,y),'g+')
plot(Z(k3,x),Z(k3,y),'bo') plot(Z(k4,x),Z(k4,y),'k<')

viernes, 5 de diciembre de 2008

Solucion

Implementar un algoritmo para dar solución a nuestro objetivo es el eje principal de este proyecto, se debe poseer conocimiento de los métodos y algoritmos que se utilizan en el procesamiento digital de imágenes, por tanto se recurren a muchos algoritmos estudiados desde muchos años atrás, algoritmos que hoy día se encuentran muy bien optimizados y otro mas que aun se encuentran en su etapa de desarrollo o madures, siguiendo el proceso que normalmente se lleva a cabo en un sistema de visión artificial primero se tratara de mejor la calidad de la imagen, una buena opción para este paso es utilizar un filtro de mediana aunque el principal inconveniente de este sea su costo computacional se probara con este filtrado, siguiendo con los pasos se debe realizar la conversión de intensidad a imagen binaria para esto se utiliza una umbralizacion, luego continuamos con la segmentación para analizar el gesto de la mano, en este paso se dibujará un recuadro alrededor del gesto de la mano, para la clasificación de el gesto primeramente se pensó en sacar líneas de hough en cada uno de los gestos para buscar un patrón que diferencie cada uno de los gestos, pero como segunda opción se piensa en calcular los siete momentos de Hu ya que estos brindan información que ayudaran a clasificar cada uno de los gestos que reconoceremos, además estos siete momentos de Hu son invariantes a escalamiento y rotación, algo que es muy importante para la definición de el entorno donde trabajara el sistema, por ultimo se recurre a un clasificador con una red neuronal.


Algoritmo


1. Mejoramiento de la imagen.
2. Conversión RGB a intensidad.
3. Mejora del contraste.
4. Umbralizacion.
5. Erosión/Dilatación.
6. Alternativa uno (Calculo de la transformada de hough).
7. Alternativa dos (Momentos de Hu).
8. Identificación de características.

jueves, 4 de diciembre de 2008

Webs de interes

Data Minig in MATLAB: http://matlabdatamining.blogspot.com/

Blog donde puede encontrase una gran variedad de recursos:herramientas y codigos fuente para la
herramienta MATLAB.

Tesis:
AN INTRODUCTION AND OVERVIEW OF A GESTURE RECOGNITION SYSTEM IMPLELMENTED FOR HUMAN COMPUTER INTERACTION
puede descargarse de: http://www.4shared.com/file/81833140/f8806a14/_Thesis.html


Desarrollo de la herramienta MTrack, un software que implementa una interfaz hombre -maquina utilizando
una camara y realizando el reconocimiento de los gestos que el usuario hace con sus manos.



Gesture Recognnition using Neural Networks
Documento donde se muestra una aproximacion a la caracterizacion de gestos humanos y como hacer su
reconocimiento usando redes neuronales
puede descargarse de:

http://www.4shared.com/file/81970976/18b417d1/GESTUAL.html

Hand Gesture Recognition Using Neural Networks

Similar al anterior documento, enfatizando en gestos hechos con las manos, tiene una gran
cantidad de codigos fuente y algoritmos.
Puede descargarse de:

http://www.4shared.com/file/81832542/a93bc481/_Final_Project.html

The Tracking of Hands for the Development of a Gesture Recognition Algorithm
Trabajo de grado de: Antonio Salvatore Micilotta.
La tesis presenta un algoritmo que sigue los movimientos de la mano junto a us brazo, para reconocimiento de gestos.
Se reconocen un total de 15 gestos y tiene dos categorias de gestos: estaticos en movimiento.
puede descargarse de:

http://www.4shared.com/file/81832647/db178e57/_micilotta_undergrad_dissertation.html
Orientation Histograms for Hand Gesture Recognition:
Metodo para reconocimieto de patrones, que hace uso de un vector de caracteristicas para conforma un
histograma de orientacion. Es un metodo util facil y de computo ràpido, y ofrece robustez ante cambios en
las condiciones de iluminacion.
http://www.merl.com/papers/TR94-03/
http://www.merl.com/papers/TR99-02/

A tutorial on Principal Components Analysis:
Tutorial donde se expone el analisis de las componentes principales o PCA (Principal component analysis).
Es una tecnica estadistica que es aplicada en campos como el reconocimeinto de caras y la compresion de
imagenes. Puede tener utilidad en el reconocimiento de gestos de la mano:
puede descargarse de: http://www.4shared.com/file/81832770/6f9c2200/_principal_components.html


HAND GESTURE RECOGNITION Gradient orientation histograms and eigenvectors methods.
Trabajo del FRAUNHOFER INSTITUT GRAPHISCHE DATENVERARBEITUNG. Se implementan los metodos de los eigenvectores(PCA) y
el de los histogramas de orientacion. EL trabajo incluye algunos fragmentos de codigo de una aplicacion desarrollada
para demostrar el uso de las anteriores tecnicas, para el renococimiento de los gestos de la mano, en el popular juego:ç
piedra, papel o tijera.
Puede descargarse de:

http://www.4shared.com/file/81832426/f9cecd29/_DeBoisset_report.html

Reconocimiento de Patrones
http://www2.ing.puc.cl/~dmery/reco/
Pagina del Curso de Reconocimiento de Patrones de la Universidad catolica chile, dictado por el profesor Domingo Mery. ç
Hay materialde clase y algunos ejemplos de codigo en matlab.

VFM
http://www2.cmp.uea.ac.uk/~fuzz/vfm/default.html.

Herramienta para captura de video desde Webcam a Matlab


Hand Tracking and Gesture Recognition for Human-Computer Interaction
Se muestra en este documento un algoritmo para seguimiento y reconocimiento, partiendo de una segmentacion
de la mano utlizando el color de la piel.
Puede descargarse en:
http://www.4shared.com/file/81833414/845198a3/_WorldSci-Cristina.html

lunes, 1 de diciembre de 2008

Comandos

Hasta el momento hemos definido tres comandos con los que se trabajara inicialmente, para la Interacción con el sistema operativo.
click derecho.

clicl izquierdo.



Doble click derecho.


Con estos comandos se trabajara para la caracterisacion de cada uno de ellos.