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
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
0