Esta vez vengo con un codigo .m para el seguimiento de colores usando una camara web y Matlab
copio el codigo y voy explicando las sentencias para que sea mas facil su comprension(el operador " % " hace que no se compile la linea, es decir, es un comentario):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all;clear all;clc;
% primero se captura un stream de video usando videoinput, con argumento
%de winvideo, numero de dispositivo y formato de la camara, si no sabes usa la
%funcion imaqtool para averiguarlo es YUY o RGB
vid=videoinput('winvideo',1,'YUY2_160x120');
%640x480 160x120
% Se configura las opciones de adquision de video
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 5;
%framegrabinterval significa que tomara cada 5 frame del stream de video adquirida
%con start(vid) se activa la adquisicion, pero todavia se toma la primera foto
start(vid)
% creamos un bucle que puede ser while always o while true en este caso
%y como mi compu es una netbook trucha(trucha=cagada=lenta=barata)
%hago que despues de 100 frames adquiridos se salga del bucle para evitar colgadas
while(vid.FramesAcquired<=100)
% se toma una snapshot del stream y se la almacena en data para trabajar mas
%facil
data = getsnapshot(vid);
% ahora vamos a reconocer el color rojo en tiempo real
% tenemos que extraer el color rojo
% de la imagen en escala de grises de la imagen adquirida en data
diff_im = imsubtract(data(:,:,1), rgb2gray(data));
%imsubstract sirve para sacar algun valor constante de una imagen, usamos como
%argumento el array de data y la funcion rgb2gray de data
%se usa medfilt2 para filtrar la senial del ruido
diff_im = medfilt2(diff_im, [3 3]);
% Convertir la imagen en escala de grises a una imagen binaria.
diff_im = im2bw(diff_im,0.18);
% para determinar el tamanio a reconocer se usa bwareopen para descartar
%imagen de rojo de menos de 300 pixels
diff_im = bwareaopen(diff_im,300);
% Etiquetamos los elementos conectados en la imagen
bw = bwlabel(diff_im, 8);
% Ahora hacemos el analisis del "objeto" detectado(que solo son pixels rojos)
%agrupados de mas de 300
% onfiguramos la region etiquetada
stats = regionprops(bw, 'BoundingBox', 'Centroid');
% mostramos la imagen
imshow(data)
hold on
%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
hold off
end
% aqui terminan los 2 bucles
% detenemos la captura
stop(vid);
%FLUSHDATA remueve la imagen del motor de adquisicion y la almacena en el buffer
flushdata(vid);
% borramos todo(como en cualquier programa)
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Este es un codigo basico para que usted senior lector pueda seguir desarrollando
copio el codigo y voy explicando las sentencias para que sea mas facil su comprension(el operador " % " hace que no se compile la linea, es decir, es un comentario):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all;clear all;clc;
% primero se captura un stream de video usando videoinput, con argumento
%de winvideo, numero de dispositivo y formato de la camara, si no sabes usa la
%funcion imaqtool para averiguarlo es YUY o RGB
vid=videoinput('winvideo',1,'YUY2_160x120');
%640x480 160x120
% Se configura las opciones de adquision de video
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 5;
%framegrabinterval significa que tomara cada 5 frame del stream de video adquirida
%con start(vid) se activa la adquisicion, pero todavia se toma la primera foto
start(vid)
% creamos un bucle que puede ser while always o while true en este caso
%y como mi compu es una netbook trucha(trucha=cagada=lenta=barata)
%hago que despues de 100 frames adquiridos se salga del bucle para evitar colgadas
while(vid.FramesAcquired<=100)
% se toma una snapshot del stream y se la almacena en data para trabajar mas
%facil
data = getsnapshot(vid);
% ahora vamos a reconocer el color rojo en tiempo real
% tenemos que extraer el color rojo
% de la imagen en escala de grises de la imagen adquirida en data
diff_im = imsubtract(data(:,:,1), rgb2gray(data));
%imsubstract sirve para sacar algun valor constante de una imagen, usamos como
%argumento el array de data y la funcion rgb2gray de data
%se usa medfilt2 para filtrar la senial del ruido
diff_im = medfilt2(diff_im, [3 3]);
% Convertir la imagen en escala de grises a una imagen binaria.
diff_im = im2bw(diff_im,0.18);
% para determinar el tamanio a reconocer se usa bwareopen para descartar
%imagen de rojo de menos de 300 pixels
diff_im = bwareaopen(diff_im,300);
% Etiquetamos los elementos conectados en la imagen
bw = bwlabel(diff_im, 8);
% Ahora hacemos el analisis del "objeto" detectado(que solo son pixels rojos)
%agrupados de mas de 300
% onfiguramos la region etiquetada
stats = regionprops(bw, 'BoundingBox', 'Centroid');
% mostramos la imagen
imshow(data)
hold on
%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
hold off
end
% aqui terminan los 2 bucles
% detenemos la captura
stop(vid);
%FLUSHDATA remueve la imagen del motor de adquisicion y la almacena en el buffer
flushdata(vid);
% borramos todo(como en cualquier programa)
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Este es un codigo basico para que usted senior lector pueda seguir desarrollando
Espero les sirva para entender el procesamiento de seniales.
Toda la informacion se encuentra en Mathworks.com
En la proxima publicacion unanse a mi en "LA LUCHA CONTRA EL PUERTO PARALELO Y SERIE....VIVA EL USB!!!" que me parecen utiles, pero ahora un poco obsoletos y estoy en contra
de esas tareas de Catedraticos que mas o menos son "Encender un Led con puerto serie o paralelo con VisualBasic o Hacer funcionar un motorcito paso a paso con puerto paralelo"(Lastima que por aqui el tiempo se detuvo).
A ellos va la proxima publicacion, podremos manejar varios canales de 8 bits, osea varios ledcitos o motorcitos(servos, dc's o pap), con un PIC18Fxxxx (son lo mismo solo varian las patitas y los adc's) desde Java, Labview, o Matlab.
Los saludo, hasta la proxima
Excelente, felicitaciones
ResponderEliminarhola como estas interesante tu codigo, pero en caso de querer tomar otro color q no sea el rojo como lo aria y donde tendria q modificar
ResponderEliminarCreo que solo tienes que cambiar la parte donde dice (:,:,1) eso quiere decir que detecta rojo, (:,:,2) o (:,:,3) azul o verde los otro colores del RGB
Eliminarque gran post, el problema es que inclusive copiando tu mismo codigo en el programa matlab no puedo hacer que este funcione, si toma video pero al momento de ingresar el color rojo no me lo encierra ni nada por el estilo. si puedieras ayudarme te lo agradeceria mucho, mira mi correo es, aip3011@hotmail.com
ResponderEliminarfunciona perfectamente amigo.. quisiera saber como obtener en variables separadas los valores de la posicion y si se puede del area del objeto.. podrias ayudarme con eso?
ResponderEliminargracias por tu aporte !!
Amigo, muchsimas gracias me salvaste la vida. Ahora quisiera preguntar, porque estoy aprendiendo, habrá posibilidad de comunicar matlab con un arduino para poder clasificar manzanas segun su tamaño y color ??
ResponderEliminarDe antemano te agradezco
te dejo mi cara-libro: Chuy Guereca Diaz
matlab trabaja con arduino uno y otro modelo, tiene sus propias librerías e instala los drivers (solo con matlab 2012a y 2012b), busque la documentación en la pagina de mathworks
EliminarFelicitaciones funciona a la primera ¡¡¡¡¡ GRACIAS
ResponderEliminarexcelente funciona muy bien...
ResponderEliminarpero como hago para que el video dure un poco mas
apenas estoy empezando con matlab y te lo agradeceria enormemente muchas gracias...
hola, primero que todo buen tutorial.
ResponderEliminartengo una pregunta, después de hallar el centriode, como hago para que el punto que gráfico sobre la imagen no se borre?, es decir que se dibuje una linea por donde pase el objeto.
gracias
como pudo hacer para graficar el desplazamiento en tiempo real
ResponderEliminar¿En caso del color amarillo?
ResponderEliminarfunciona gracias pero como hago con otro color
ResponderEliminargracias por el código! buen programa!
ResponderEliminaralguien sabe como realizarlo con otro color ???
ResponderEliminarExcelente codigo para inciarse. Mis congeneres, para aquellos que deseen jugar con colores, en este codigo solo puedes trabajar con RGB (Red, Green, Blue)
ResponderEliminarEj:
diff_im = imsubtract(data(:,:,1), rgb2gray(data)); %Color Rojo
diff_im = imsubtract(data(:,:,2), rgb2gray(data)); %Color Verde
diff_im = imsubtract(data(:,:,3), rgb2gray(data));% Color Azul
para trabajar con mas colores tendriamos que cambiar el sistema de captura de colores. Saludos.
gracias, por la aclaración, que tendría que hacer para detectar el color amarillo.
EliminarMuchas gracias, me sirvió mucho.
ResponderEliminarHola necesito restas la posición en X del segundo objetos con el primero y igualmente con Y, actualizando ese dato en tiempo real.
ResponderEliminarespero me puedas ayudar muchas gracias
muchas gracias todo resulto ok
ResponderEliminar