Main Content

Encontrar la longitud de un péndulo en movimiento

En este ejemplo se muestra cómo calcular la longitud de un péndulo en movimiento. Puede capturar imágenes en una serie temporal con el cuadro de herramientas de adquisición de imágenes™ y analizarlas con el cuadro de herramientas de procesamiento de imágenes™.

Paso 1: Adquirir imágenes

Cargue los marcos de imagen de un péndulo en movimiento. Los fotogramas del archivo MAT se adquirieron utilizando las siguientes funciones en el Cuadro de herramientas de adquisición de imágenes.pendulum.mat

% Access an image acquisition device (video object). % vidimage=videoinput('winvideo',1,'RGB24_352x288');  % Configure object to capture every fifth frame. % vidimage.FrameGrabInterval = 5;  % Configure the number of frames to be logged. % nFrames=50; % vidimage.FramesPerTrigger = nFrames;  % Access the device's video source. % src=getselectedsource(vidimage);  % Configure device to provide thirty frames per second. % src.FrameRate = 30;  % Open a live preview window. Focus camera onto a moving pendulum. % preview(vidimage);  % Initiate the acquisition. % start(vidimage);  % Wait for data logging to finish before retrieving the data. % wait(vidimage, 10);  % Extract frames from memory. % frames = getdata(vidimage);  % Clean up. Delete and clear associated variables. % delete(vidimage) % clear vidimage  % load MAT-file  load pendulum; 

Paso 2: Explora la secuencia con IMPLAY

Ejecute el siguiente comando para explorar la secuencia de imágenes en .implay

implay(frames); 

Paso 3: Seleccione Región donde el péndulo está oscilando

Puede ver que el péndulo se balancea en la mitad superior de cada fotograma de la serie de imágenes. Cree una nueva serie de marcos que contenga solo la región donde se balancea el péndulo.

Para recortar una serie de fotogramas utilizando , primero realice en un fotograma y almacene su imagen de salida.imcropimcrop A continuación, utilice el tamaño de la salida anterior para crear una serie de regiones de fotograma. Para mayor comodidad, utilice el que se cargó en .rectpendulum.matimcrop

nFrames = size(frames,4); first_frame = frames(:,:,:,1); first_region = imcrop(first_frame,rect); frame_regions = repmat(uint8(0), [size(first_region) nFrames]); for count = 1:nFrames   frame_regions(:,:,:,count) = imcrop(frames(:,:,:,count),rect); end imshow(frames(:,:,:,1)) 

Paso 4: Segmentar el péndulo en cada fotograma

Observe que el péndulo es mucho más oscuro que el fondo. Puede segmentar el péndulo en cada fotograma convirtiendo el marco a escala de grises, umbraleándolo utilizando y eliminando estructuras de fondo mediante y .imbinarizeimopenimclearborder

inicializar matriz para contener los marcos de péndulo segmentados.

seg_pend = false([size(first_region,1) size(first_region,2) nFrames]); centroids = zeros(nFrames,2); se_disk = strel('disk',3); for count = 1:nFrames     fr = frame_regions(:,:,:,count);      gfr = rgb2gray(fr);     gfr = imcomplement(gfr);      bw = imbinarize(gfr,.7);  % threshold is determined experimentally     bw = imopen(bw,se_disk);     bw = imclearborder(bw);     seg_pend(:,:,count) = bw;      montage({fr,labeloverlay(gfr,bw)});     pause(0.2)  end 

Paso 5: Encuentra el centro del péndulo segmentado en cada fotograma

Se puede ver que la forma del péndulo variaba en diferentes marcos. Esto no es un problema serio porque solo necesita su centro. Utilizará los centros de péndulo para encontrar la longitud del péndulo.

Se utiliza para calcular el centro del péndulo.regionprops

pend_centers = zeros(nFrames,2); for count = 1:nFrames     property = regionprops(seg_pend(:,:,count), 'Centroid');     pend_centers(count,:) = property.Centroid; end 

Muestre los centros de péndulo utilizando .plot

x = pend_centers(:,1); y = pend_centers(:,2); figure plot(x,y,'m.') axis ij axis equal hold on; xlabel('x'); ylabel('y'); title('Pendulum Centers'); 

Paso 6: Calcular radio ajustando un círculo a través de centros de péndulo

Reescribir la ecuación básica de un círculo:

(x-xc)^2 + (y-yc)^2 = radius^2

¿dónde está el centro, en términos de parámetros, como(xc,yc)abc

x^2 + y^2 + a*x + b*y + c = 0

donde , , y .a = -2*xcb = -2*ycc = xc^2 + yc^2 - radius^2

Puede resolver parámetros , y utilizar el método de mínimos cuadrados.abc Reescriba la ecuación anterior como

a*x + b*y + c = -(x^2 + y^2)

que también se puede reescribir como

[x y 1] * [a;b;c] = -x^2 - y^2.

Resuelva esta ecuación utilizando el operador backslash( ).\

El radio del círculo es la longitud del péndulo en píxeles.

abc = [x y ones(length(x),1)] \ -(x.^2 + y.^2); a = abc(1); b = abc(2); c = abc(3); xc = -a/2; yc = -b/2; circle_radius = sqrt((xc^2 + yc^2) - c); pendulum_length = round(circle_radius) 
 pendulum_length =     253  

Superponer círculo y círculo centro en la parcela de centros de péndulo.

circle_theta = pi/3:0.01:pi*2/3; x_fit = circle_radius*cos(circle_theta)+xc; y_fit = circle_radius*sin(circle_theta)+yc;  plot(x_fit,y_fit,'b-'); plot(xc,yc,'bx','LineWidth',2); plot([xc x(1)],[yc y(1)],'b-'); text(xc-110,yc+100,sprintf('Pendulum length = %d pixels', pendulum_length)); 

Consulte también

| | | | |