jueves, 18 de diciembre de 2008

implementación de la solución y resultados

DISEÑO DEL PROYECTO

clear all
close all
clc

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%PREPROCESAMIENTO DE LA IMAGEN%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

RGB = imread('20.jpg');%cargamos la imagen
RGB = imresize(RGB, [300 400]);% devuelve la imagen que es la escala veces el tamaño de la entrada A.
I = rgb2gray(RGB); % convierte a escala de grises

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%PROCESAMIENTO DE LA IMAGEN%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

BW = EDGE(I,'canny',[0.1 0.2],2); %extraemos los ejes,ajustando los parametros
[H,theta,rho] = hough(BW);%%aplicamos la transformada de Hough
P = houghpeaks(H,20,'threshold',50); %%encontramos los picos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%SEGMENTACION%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
try %%%%%%%%%solucion del error en caso de no detectar ninguna linea
lines = houghlines(BW,theta,rho,P,'FillGap',10,'MinLength',40);
catch
d=size(lines)
end
d=size(lines)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
buscando=0;
imshow(RGB),hold on
if d(1,2) > 1 %%%%%%solucion del error en caso de no encontrar ninguna linea mediante Hough
a=0;
p=0;
b1=0;%%%inicializamos las variables auxiliares
b2=0;
lon=0;

z=length(lines);
for k = 1:z %%hacer para todas las lineas detectadas
xy = [lines(k).point1; lines(k).point2];%% dibujar cada una de las lineas

plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');%%%colorear el punto en x,y de la linea de inicio en amarillo
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%%%%%%colorear el punto en x,y de la linea de inicio en rojo

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%EXTRACCION DE CARACTERISTICAS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%se eliminan lineas verticales y horizontales que no son de interes
%se toman los puntos mas cercanos al piso como las lineas de interes para
%guiar al robot

% se ubican las lineas de interes de la derecha
if(xy(1,1)+20150 && xy(2,1)>200)
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

if (xy(2,2)>a)
a= xy(2,2);
b=k


end

b1=1;%%variable auxiliar
end


%se ubican las lineas de interes de la derecha izquierda
if(xy(1,1)+20xy(2,2)+10 && xy(1,2) >150 && xy(1,1)<200)>p)
p= xy(1,2)
d=k


end
b2=1;%%variable auxiliar
end



end


if (b1==1&&b2==1) %%en caso de ubicar las dos lineas del camino que cumplan con las condiciones entrar.

xyd = [lines(b).point1; lines(b).point2];
plot(xyd(2,1),xyd(2,2),'x','LineWidth',8,'Color','blue');
xyi = [lines(d).point1; lines(d).point2]; % dibujar en azul los puntos que serviran de guia al robot
plot(xyi(1,1),xyi(1,2),'x','LineWidth',8,'Color','blue');
lon=norm(lines(d).point1- lines(b).point2) %%encontar la norma de los puntos en azul

mitadcamino=xyi(1,1)+(lon/2)%%%ubicar la pocicion en x donde esta la mitad del camino

%%%%ubico con x la posicion del camino a seguir con respecto a la pocicion
%%%%de la camara.
plot(mitadcamino,xyi(1,2),'x','LineWidth',20,'Color','white');% centro del camino en blanco
plot(200,xyi(1,2),'x','LineWidth',20,'Color','black');%centro de la camara en negro

diferencia=mitadcamino-200%%% calculo la desviacion de la camara con respecto al camino

if(lon >120)%%establesco que la longitud de los puntos de las lineas del camino a seguir tiene que ser mayor a 120 pixeles

if (diferencia >-20 && diferencia <20)>21)
title('gire ala derecha')
end

if (diferencia <-21) title('gire ala izquierda') end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (b1==1 && b2==0)%%%en caso de encontrar solo una linea con las caracteristicas %%ya sea a la derecha o ala izquierda tomar la decicion. title('gire ala izquierda') end if (b1==0 && b2==1) title('gire ala derecha') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (b1==0 && b2==0) %%% en caso de no encontrar ninguna linea que cumpla con las caracteristicas mostrar buscando... title('buscando...') buscando=1; %% variable auxiliar end if (lon <120 b1="=" b2="=" buscando="1;" buscando="=" bw =" edge(I,'sobel',[],'vertical');" p =" houghpeaks(H,20,'threshold',50);" lines =" houghlines(BW,theta,rho,P,'FillGap',20,'MinLength',80);" hi="size(lines)%lines=" hi="size(lines)"> 1
t=0;
incp=0;
absoluto=0;
con=0;
aga=0;
lineas=0;
z=length(lines);

for k = 1:z
xy = [lines(k).point1; lines(k).point2];
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');


if(xy(1,1)*1.15>xy(2,1)&& xy(1,1)*0.8t)
t= xy(2,2);
t1=k
aga=1;
end

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



if aga==1 %%%% si encuentra ese punto mas a bajo colorearlo de azul con una x%%%%%%%%%%%%%%%%%%%%%
xyp = [lines(t1).point1; lines(t1).point2];
plot(xyp(2,1),xyp(2,2),'x','LineWidth',20,'Color','blue');
y1=xyp(1,2)
x1=xyp(1,1)
y2=xyp(2,2)
con=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%condiciones sobre donde no puede estar ubicado el punto azul
if x1 >389
x1=389
end

if x1 <11 x1="11" k1 =" y1:y2" h1="I(k1,x1-10);" lineas="(y2-y1);" h2="I(k1,x1+10);" lineas="(y2-y1);">15) %%si la variaciones son mayores a 15 entonces incrementa con
con=con+1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%en absoluto guardo la variacion de cada uno de los pixeles de la
%%%izquierda y la derecha buscando homogeneidad
if(h1>h2)
absoluto=h1-h2
end

if(h1(lineas/2)) %%si la variaciones que encontro con son mayores
%%%a la mitad de los pixeles de las lineas verticales alladas entonces
%%%se detecta como camino alternativo
for k1 = y1:y2


plot(x1+20,k1,'x','LineWidth',10,'Color','blue');
plot(x1-20,k1,'x','LineWidth',10,'Color','blue'); %%dibujo el camino alternativo


end
end
end


end


end


RESULTADOS OBTENIDOS

En esta sección se muestra algunos resultados de la experimentación realizada con el método propuesto. Para validar el método se ha realizado dos tipos de pruebas. Mediante la primera se pretende determinar el éxito en la detección de caminos alternativos en imágenes que efectivamente muestran caminos alternativos que el robot pueda encontrar durante su trayectoria. Con la segunda se pretende comprobar que el método detecta correcta mente las líneas de las esquinas de las paredes para poder guiarse a través del pasillo por el cual el robot tendrá que navegar .En el primer caso se han usado un total de 10 imágenes de distintos tipos de caminos alternativos tomadas desde diferentes perspectivas y desde diferentes distancias simulando a un robot que circula por los pasillos, a pesar de que se menciono que la cámara debía estar fija a una altura apuntando siempre a un determinado ángulo se vario la altura y el ángulo para ver la robustez del sistema obteniendo solo malos resultados si se variaba mucho el ángulo ,como era de esperarse puesto que el sistema solo detecta las líneas que sean verticales con cierto porcentaje de inclinación para lo que fue diseñado. En la segunda prueba se han usado 20 imágenes desde diferentes perspectivas sin variar la altitud que fue en un principio de 47 cm dando como resultado que el sistema no detecta ningún falso positivo demostrando un comportamiento robusto.

La figura 5 muestra en la primera fila imágenes de los pasillos con puertas, en la segunda fila se muestra las imágenes tratadas para obtenerlas a escala de grises, en la tercera fila se muestra los resultados de aplicar los filtros de Canny (fila3 colmna1) para detectar los bordes de las esquinas para guiar al robot y Sobel vertical (fila3 columna2) con el cual se obtuvieron mejores resultados que con Canny para el caso de detectar caminos alternativos como es en este caso las puertas.
En la cuarta fila se muestran el conjunto total de segmentos que obtiene el detector basado en la
Transformada de Hough y por ultimo en la fila 5 se hace un filtrado de las líneas que no son de interés y se obtiene la detección del camino y por lo tanto la orden de control respectiva según la ubicación del robot (ver figura 5 fila 5 columna 1), además de ubicación del camino alternativo detectando las esquinas de la puerta (ver figura 5 fila 5 columna2).
FIGURA 5: De arriba a abajo. Imagen original. Todos los
Segmentos detectados. Segmentos candidatos seleccionados.
Puerta mas cercana detectada y camino detectado.

No hay comentarios: