18.1 计算运动中单摆的长度(2)
注意到摆的颜色要比周围其他背景的颜色深,因此可以先将每帧图像转化为灰度图像,如图18-4所示。然后再将灰度图像转化为二值图像,如图18-5所示,使用imopen和imclearborder函数对二值图像进行形态学操作,对摆动目标进行分割。
![]() |
图18-4 灰度图像 |
![]() |
图18-5 二值图像 |
求取摆长。
代码如下:
- pend_centers = zeros(nFrames,2);
- for count = 1:nFrames
- lab = bwlabel(seg_pend(:,:,count));%求标注矩阵
- property = regionprops(lab,'Centroid');%求图像质心信息
- pend_centers(count,:) = property.Centroid;
- end
- 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');
- 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)%取整
- circle_theta = pi/3:0.01:pi*2/3;%角度范围
- x_fit = circle_radius*cos(circle_theta)+xc;%质心x轴坐标
- y_fit = circle_radius*sin(circle_theta)+yc;%质心y轴坐标
- 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));
注意到在每一帧图像中分隔出来的摆动目标形状并不完全相同,因此我们可以通过提取摆动目标的质心来避免这个问题。MATLAB图像处理工具箱中提供了函数regionprops可以求目标对象的质心。图18-6中底部的弧为求取的图像质心。
![]() |
(点击查看大图)图18-6 简化的摆动模型 |
圆的方程为:
其中 为圆心。另一种方程描述为:
联系客服