Matlab - Problema con puerto serie y adquisicon de imagenes

   
Vista:

Problema con puerto serie y adquisicon de imagenes

Publicado por mrio1577 (1 intervención) el 10/04/2014 07:36:42
Tengo un gran problema con el puerto serial, estoy haciendo un programa en que detecte objetos de color rojo, azul verde, el y al detectarlo este los encierra en un rectangulo, entonces al detectar el color rojo tiene que enviar por puerto serie el numero 1, con el azul el numero 2 y ocn el verde el numero 3, el prblema consiste en que cuando pondo el codig de serial y lo ejecuto y paso el objeto de esos colores la camara se ocngela y cuando quito ese objeto ya vuelve a su estado de normalidad. Le puse una instruccion "disp" para que me desplegara un el mensaje de "Se detecto el color rojo" entonces ala hora de pasar el objeto rojo se ocngela la camara pero si esta desplegando el mennsaje.

Entonces mi duda es como hago para que no se ocngele ya que si quito las instrucciones del puerto serial no se congela la camara si me señala el objeto con el rectangulo y me desplegs que si es de color rojo, Saludos

CODIGO DEL PROGRAMA

vid=videoinput('winvideo',1,'YUY2_320x240'); %Activar camara
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 5;
start(vid)
ser = serial('COM5','BaudRate',19200,'DataBits',8);
while(vid.FramesAcquired<=100)
imagen = getsnapshot(vid);%Se toma las fotos

imagen1 = imsubtract(imagen(:,:,1), rgb2gray(imagen)); %Sacar el rojo de la imagen escala de grises
imagen1 = medfilt2(imagen1, [3 3]); %Quitar ruido de la imagen
imagen1 = im2bw(imagen1,0.18);%Conversion de escala de grises a bianria
imagen1 = bwareaopen(imagen1,300); %Se uso bwopen para poner como limite 300pixeles de color rojo

imagen2 = imsubtract(imagen(:,:,2), rgb2gray(imagen)); %Sacar el rojo de la imagen escala de grises
imagen2 = medfilt2(imagen2, [3 3]); %Quitar ruido de la imagen
imagen2 = im2bw(imagen2,0.18);%Conversion de escala de grises a bianria
imagen2 = bwareaopen(imagen2,300); %Se uso bwopen para poner como limite 300pixeles de color rojo

imagen3 = imsubtract(imagen(:,:,3), rgb2gray(imagen)); %Sacar el rojo de la imagen escala de grises
imagen3 = medfilt2(imagen3, [3 3]); %Quitar ruido de la imagen
imagen3 = im2bw(imagen3,0.18);%Conversion de escala de grises a bianria
imagen3 = bwareaopen(imagen3,300); %Se uso bwopen para poner como limite 300pixeles de color rojo

a = bwlabel(imagen1, 8);%Identificacion de regiones, es decir lo que no sea rojo lo tomara como fondo negro
stats = regionprops(a, 'BoundingBox', 'Centroid','Area'); %ccalcula el centroide, BoundingBox calcula la posicion

b = bwlabel(imagen2, 8);%Identificacion de regiones, es decir lo que no sea rojo lo tomara como fondo negro
stats1 = regionprops(b, 'BoundingBox', 'Centroid','Area'); %ccalcula el centroide, BoundingBox calcula la posicion

c = bwlabel(imagen3, 8);%Identificacion de regiones, es decir lo que no sea rojo lo tomara como fondo negro
stats2 = regionprops(c, 'BoundingBox', 'Centroid','Area'); %ccalcula el centroide, BoundingBox calcula la posicion
imshow(imagen)

[y1,x1]=size(imagen1);
[y2,x2]=size(imagen2);
[y3,x3]=size(imagen3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
z=0;
for y=1:y1
for x=1:x1
if double(imagen1(y,x))==1
z=z+1;
end

end
end

if z>=300
disp('Objeto rojo detectado');
e=2;
fopen(ser);
fwrite(ser,e);
end
fclose(ser);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55
z1=0;
for y=1:y2
for x=1:x2
if double(imagen2(y,x))==1
z1=z1+1;
end

end
end

if z1>=300
disp('Objeto verde detectado');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
z2=0;
for y=1:y3
for x=1:x3
if double(imagen3(y,x))==1
z2=z2+1;
end

end
end

if z2>=300
disp('Objeto azul detectado');
end

hold on

%objeto = 1:length(stats);
%b = stats(objeto).Area;
%s=find([stats.Area]);
%if s>=300
% disp('Objeto rojo detectado')
%end

%este es un bucle para encerrar el objeto rojo en un rectangulp y una cruz en el
%centroide(solo es programacion basica de matlab)
for object = 1:length(stats)
bb = stats(object).BoundingBox;
bc = stats(object).Centroid;
rectangle('Position',bb,'EdgeColor','r','LineWidth',2)
plot(bc(1),bc(2), '-m+')
a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2)))));
set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for object = 1:length(stats1)
bb = stats1(object).BoundingBox;
bc = stats1(object).Centroid;
rectangle('Position',bb,'EdgeColor','r','LineWidth',2)
plot(bc(1),bc(2), '-m+')
a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2)))));
set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for object = 1:length(stats2)
bb = stats2(object).BoundingBox;
bc = stats2(object).Centroid;
rectangle('Position',bb,'EdgeColor','r','LineWidth',2)
plot(bc(1),bc(2), '-m+')
a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2)))));
set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
end


hold off
end

stop(vid);

flushdata(vid); %Borrar la imagen de la de adquisicion de imagenes

clear all
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder