Anuncio

Colapsar
No hay ningún anuncio todavía.

Seguir el movimiento de un objeto (vídeo)

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Matlab Seguir el movimiento de un objeto (vídeo)

    Hola, resulta que tengo que hacer un proyecto de mecanica que consiste en una pelota atada a un resorte oscilando verticalmente.

    La pelota (negra en un fondo blanco) es filmada con una camara de alta velocidad, lo que necesito es hacer una gráfica de altura vs tiempo con matlab preferiblemente, pero no tengo mucha experiencia usando estos programas y la verdad no he encontrado nada.

    Si me pudiesen ayudar con algún link o alguna indicación se los agradecería.

  • #2
    Re: Seguir el movimiento de un objeto (vídeo)

    Hace un tiempo encontré justo algo así, pero lo perdí. Prueba con esta función que he encontrado por internet:

    [FONT=Trebuchet MS]close all;clear all;clc;[/FONT]

    [FONT=Trebuchet MS]% primero se captura un stream de video usando videoinput, con argumento[/FONT]
    [FONT=Trebuchet MS]%de winvideo, numero de dispositivo y formato de la camara, si no sabes usa la[/FONT]
    [FONT=Trebuchet MS]%funcion imaqtool para averiguarlo es YUY o RGB[/FONT]
    [FONT=Trebuchet MS]vid=videoinput('winvideo',1,'YUY2_160x120');[/FONT]
    [FONT=Trebuchet MS]%640x480 160x120[/FONT]
    [FONT=Trebuchet MS]% Se configura las opciones de adquision de video[/FONT]
    [FONT=Trebuchet MS]set(vid, 'FramesPerTrigger', Inf);[/FONT]
    [FONT=Trebuchet MS]set(vid, 'ReturnedColorspace', 'rgb')[/FONT]
    [FONT=Trebuchet MS]vid.FrameGrabInterval = 5;[/FONT]
    [FONT=Trebuchet MS]%framegrabinterval significa que tomara cada 5 frame del stream de video adquirida[/FONT]
    [FONT=Trebuchet MS]%con start(vid) se activa la adquisicion, pero todavia se toma la primera foto[/FONT]
    [FONT=Trebuchet MS]start(vid)[/FONT]

    [FONT=Trebuchet MS]% creamos un bucle que puede ser while always o while true en este caso[/FONT]
    [FONT=Trebuchet MS]%y como mi compu es una netbook trucha(trucha=cagada=lenta=barata)[/FONT]
    [FONT=Trebuchet MS]%hago que despues de 100 frames adquiridos se salga del bucle para evitar colgadas[/FONT]
    [FONT=Trebuchet MS]while(vid.FramesAcquired<=100)[/FONT]

    [FONT=Trebuchet MS]% se toma una snapshot del stream y se la almacena en data para trabajar mas[/FONT]
    [FONT=Trebuchet MS]%facil[/FONT]
    [FONT=Trebuchet MS]data = getsnapshot(vid);[/FONT]

    [FONT=Trebuchet MS]% ahora vamos a reconocer el color rojo en tiempo real[/FONT]
    [FONT=Trebuchet MS]% tenemos que extraer el color rojo[/FONT]
    [FONT=Trebuchet MS]% de la imagen en escala de grises de la imagen adquirida en data[/FONT]
    [FONT=Trebuchet MS]diff_im = imsubtract(data(:,:,1), rgb2gray(data));[/FONT]
    [FONT=Trebuchet MS]%imsubstract sirve para sacar algun valor constante de una imagen, usamos como[/FONT]
    [FONT=Trebuchet MS]%argumento el array de data y la funcion rgb2gray de data[/FONT]
    [FONT=Trebuchet MS]%se usa medfilt2 para filtrar la senial del ruido[/FONT]
    [FONT=Trebuchet MS]diff_im = medfilt2(diff_im, [3 3]);[/FONT]
    [FONT=Trebuchet MS]% Convertir la imagen en escala de grises a una imagen binaria.[/FONT]
    [FONT=Trebuchet MS]diff_im = im2bw(diff_im,0.18);[/FONT]

    [FONT=Trebuchet MS]% para determinar el tamanio a reconocer se usa bwareopen para descartar[/FONT]
    [FONT=Trebuchet MS]%imagen de rojo de menos de 300 pixels[/FONT]
    [FONT=Trebuchet MS]diff_im = bwareaopen(diff_im,300);[/FONT]

    [FONT=Trebuchet MS]% Etiquetamos los elementos conectados en la imagen[/FONT]
    [FONT=Trebuchet MS]bw = bwlabel(diff_im, 8);[/FONT]

    [FONT=Trebuchet MS]% Ahora hacemos el analisis del "objeto" detectado(que solo son pixels rojos)[/FONT]
    [FONT=Trebuchet MS]%agrupados de mas de 300[/FONT]
    [FONT=Trebuchet MS]% onfiguramos la region etiquetada[/FONT]
    [FONT=Trebuchet MS]stats = regionprops(bw, 'BoundingBox', 'Centroid');[/FONT]

    [FONT=Trebuchet MS]% mostramos la imagen[/FONT]
    [FONT=Trebuchet MS]imshow(data)[/FONT]

    [FONT=Trebuchet MS]hold on[/FONT]

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

    [FONT=Trebuchet MS]hold off[/FONT]
    [FONT=Trebuchet MS]end[/FONT]
    [FONT=Trebuchet MS]% aqui terminan los 2 bucles[/FONT]

    [FONT=Trebuchet MS]% detenemos la captura[/FONT]
    [FONT=Trebuchet MS]stop(vid);[/FONT]


    [FONT=Trebuchet MS]%FLUSHDATA remueve la imagen del motor de adquisicion y la almacena en el buffer[/FONT]
    [FONT=Trebuchet MS]flushdata(vid);[/FONT]

    [FONT=Trebuchet MS]% borramos todo(como en cualquier programa)[/FONT]
    [FONT=Trebuchet MS]clear all

    Saludos![/FONT]
    'Como físico, no temo a la muerte, temo al tiempo.'
    'Bene curris, sed extra vium.'
    'Per aspera ad astra.'

    Comentario


    • #3
      Re: Seguir el movimiento de un objeto (vídeo)

      Gracias, puse a correr ese programa pero lo que hace es que se pone a filmar con la camara del computador y sigue a los objetos de color rojo, cuando guarda lo que filma queda un archivo .fig que no entiendo qué es, se supone que debería ser un vídeo pero parece como una imagen, y parece que solo se abre con matlab.

      La cuestión es que ya ye tengo el vídeo, no quiero que filme, quiero que use un vídeo que ya tengo guardado.

      Además, no veo en qué parte del programa se da la orden de que siga al rojo, para así cambiar esa parte y hacer que siga al negro.

      Comentario


      • #4
        Re: Seguir el movimiento de un objeto (vídeo)

        Creo que es justo esta línea, pero no tengo ni idea de la función utilizada ni de como cambiarla:
        [FONT=Trebuchet MS]diff_im = imsubtract(data(:,:,1), rgb2gray(data));
        [/FONT]
        En un principio el negro en RGB el negro es el #0000, así que quizá cambiando la línea por:

        [FONT=Trebuchet MS]diff_im = imsubtract(data(0,0,0), rgb2gray(data));

        [/FONT]
        Reconozca el negro.

        Un saludo!
        'Como físico, no temo a la muerte, temo al tiempo.'
        'Bene curris, sed extra vium.'
        'Per aspera ad astra.'

        Comentario


        • #5
          Re: Seguir el movimiento de un objeto (vídeo)

          cambié eso por lo que pones, por (1,:, y por otras combinaciones, pero el programa no corre :/
          Última edición por javier m; 10/04/2013, 22:48:59.

          Comentario


          • #6
            Re: Seguir el movimiento de un objeto (vídeo)

            Pues entonces lo siento por no poder ayudarte tío... Prueba metiendo (:,:, quizá haga algo cogiendo toda la gama de colores de todos... (si eso es la gama de colores, claro).
            'Como físico, no temo a la muerte, temo al tiempo.'
            'Bene curris, sed extra vium.'
            'Per aspera ad astra.'

            Comentario


            • #7
              Re: Seguir el movimiento de un objeto (vídeo)

              Ese fue el primero que probé después del tuyo

              Bueno no importa, gracias de todos modos, creo que probaré con otro programa.

              Comentario


              • #8
                Re: Seguir el movimiento de un objeto (vídeo)

                Hola, podes probar con un software gratuito que se llama Tracker, analiza videos para hacer justamente lo que pedis, y te permite exportar la tabla de posicion en funcion del tiempo (entre otras cosas) como un txt, que despues podes abrir con Matlab. La pagina de descarga es
                http://www.dgeo.udec.cl/~andres/Tracker/
                es bastante facil de usar, y si tenes problemas en youtube podes encontrar varios tutoriales

                Comentario


                • #9
                  Re: Seguir el movimiento de un objeto (vídeo)

                  Ese era el que estaba usando , pero como son 22000 cuadros los que tenía que marcar (el autotracker, como que no sirve) entonces le pedí a un profesor que me ayudara y me lo hizo en matlab.

                  Ahorita mismo estoy trabajando en eso de afan porque es para hoy xD

                  Comentario


                  • #10
                    Re: Seguir el movimiento de un objeto (vídeo)

                    De todos modos, Tracker te permite elegir cada cuántos cuadros quieres marcar. En la ayuda (http://www.cabrillo.edu/~dbrown/trac.../frameset.html) lo tienes en el punto 2:
                    "In the clip settings dialog, set the Start frame and End frame to define the range you wish to analyze. You can drag the player's slider to scan through the video and quickly find the frames of interest. If the video contains too many frames to analyze (more than 20 or so can become tedious), increase the Step size to automatically skip frames."
                    A mi amigo, a quien todo debo.

                    Comentario


                    • #11
                      Re: Seguir el movimiento de un objeto (vídeo)

                      ah caray, gracias.
                      Para la proxima.

                      Comentario

                      Contenido relacionado

                      Colapsar

                      Trabajando...
                      X