lunes, 17 de mayo de 2010

VISION POR COMPUTADORA, MATLAB

el siguiente codigo que se muestra el toda la programacion en Matlab para la vision por medio de una webcam que en este caso es la Eye 312 de Genius.

%Dar de alta la camara resolucion y caracteristicas

imaqhwinfo; %informacion de las camaras detectadas(*******************NO ES NECESARIO PARA EL PROGRAMA)
vid = videoinput('winvideo',1, 'RGB24_320x240');

%Configuracion del puerto serial para la comunicacion con el micro

SerPIC = serial('COM3');
set(SerPIC,'BaudRate', 2400, 'DataBits', 8, 'Parity', 'none','StopBits', 1, 'FlowControl', 'none');
fopen(SerPIC);

%Declaracion de variables y vectores

objetos=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
laser=66;
grandote=0;

%Reconocimiento de ambiente

a=getsnapshot(vid);
aa=rgb2gray(a);

%Ciclo principal en el que se correra el programa
for k = 0:0.25:7

%Obtiene imagen con cambios
b=getsnapshot(vid);
bb=rgb2gray(b);

%Diferencia entre imagen actual y el entorno aprendido
c=imsubtract(bb,aa);

%binarizacion de la imagen resultado(se calibra a las condiciones de luz)
d=c>=20;

%filtro antiruido
magic=strel('square', 2);
link=imerode(d, magic);

%Despliega foto(*************NO ES NECESARIO PARA EL PROGRAMA)
imshow(link);
hold on

%Obtener informacion de la foto
cen = regionprops(link);
num = numel(cen);

%Condicion donde se debe detectar minimo 1 objeto
if (num ~= 0)

%Identificador de objetos(se tiene que calibrar a las condiciones de luz)
for l = 1:num
if (cen(l).Area <= 47)&&(cen(l).Area >= 5)
laser = l;
end
objetos(l)=cen(l).Area;
end

%algoritmo burbuja para ordenar objetos de mas grande a mas chico
for i=1:9
for j=i+1:10
if (objetos(i) < objetos(j))
temp = objetos(i);
objetos(i) = objetos(j);
objetos(j) = temp;
end
end
end
%fin de algoritmo burbuja

%detectar el num del objeto mas grande
for z=1:num
if (cen(z).Area == objetos(1))
grandote = z;
end
end

%Condiciones para mover la pistola
if (laser == 66)
master = 100;
disp(['DISPARA']); %Despliega en la pantalla(*************NO ES NECESARIO PARA EL PROGRAMA)
else
if (objetos(1) ~= cen(laser).Area)
salidax = cen(grandote).Centroid(1) - cen(laser).Centroid(1);
saliday = cen(grandote).Centroid(2) - cen(laser).Centroid(2);
if (salidax > 0)&&(saliday > 0)
master=41; %muevete a la derecha y arriba
disp(['derecha abajo ']); %Despliega en la pantalla(*************NO ES NECESARIO PARA EL PROGRAMA)
else if (salidax < 0)&&(saliday > 0)
master = 69; %muevete izquerda y arriba
disp(['izquierda abajo ']); %Despliega en la pantalla(*************NO ES NECESARIO PARA EL PROGRAMA)
else if (salidax > 0)&&(saliday < 0)
master = 22; %muevete derecha y abajo
disp(['dereha arriba ']); %Despliega en la pantalla(*************NO ES NECESARIO PARA EL PROGRAMA)
else if (salidax < 0)&&(saliday < 0)
master = 255; %muevete izquierda y abajo
disp(['izquierda arriba ']); %Despliega en la pantalla(*************NO ES NECESARIO PARA EL PROGRAMA)
end
end
end
end
end
end
end

puppet = typecast(master, unit8);
fwrite(SerPIC, '%s', puppet); %Mandar la variable master para mover o disparar


laser=66;
end
%fin del ciclo principal del programa

fclose(SerPIC)
delete(SerPIC)
clear SerPIC

%fin de programa

No hay comentarios:

Publicar un comentario