分享

18.1 计算运动中单摆的长度(2) - 51CTO.COM

 寒山月 2010-04-14

18.1 计算运动中单摆的长度(2)

http://book.51cto.com  2009-06-24 14:43  张强/王正林  电子工业出版社  我要评论()

18.1  计算运动中单摆的长度(2)

注意到摆的颜色要比周围其他背景的颜色深,因此可以先将每帧图像转化为灰度图像,如图18-4所示。然后再将灰度图像转化为二值图像,如图18-5所示,使用imopen和imclearborder函数对二值图像进行形态学操作,对摆动目标进行分割。

 
图18-4  灰度图像
 
图18-5  二值图像

求取摆长。

代码如下:

  1. pend_centers = zeros(nFrames,2);  
  2. for count = 1:nFrames  
  3.     lab = bwlabel(seg_pend(:,:,count));%求标注矩阵  
  4.     property = regionprops(lab,'Centroid');%求图像质心信息  
  5.     pend_centers(count,:) = property.Centroid;  
  6. end  
  7. x = pend_centers(:,1); y = pend_centers(:,2);  
  8. figure; plot(x,y,'m.'), %绘制单摆的质心  
  9. axis ij; axis equal,   
  10. hold on;  
  11. xlabel('x'); ylabel('y');  
  12. title('pendulum centers');  
  13. abc = [x y ones(length(x),1)] \ -(x.^2 + y.^2);%求系数  
  14. a = abc(1); b = abc(2); c = abc(3);  
  15. xc = -a/2; yc = -b/2;  
  16. circle_radius = sqrt((xc^2 + yc^2) - c);%半径  
  17. pendulum_length = round(circle_radius)%取整  
  18. circle_theta = pi/3:0.01:pi*2/3;%角度范围  
  19. x_fit = circle_radius*cos(circle_theta)+xc;%质心x轴坐标  
  20. y_fit = circle_radius*sin(circle_theta)+yc;%质心y轴坐标  
  21. plot(x_fit,y_fit,'b-');%标注圆周  
  22. plot(xc,yc,'bx','LineWidth',2);%标注求取的圆心  
  23. plot([xc x(1)],[yc y(1)],'b-');%标注半径  
  24. text(xc-110,yc+100,sprintf('pendulum length = %d pixels',...  
  25.     pendulum_length)); 

注意到在每一帧图像中分隔出来的摆动目标形状并不完全相同,因此我们可以通过提取摆动目标的质心来避免这个问题。MATLAB图像处理工具箱中提供了函数regionprops可以求目标对象的质心。图18-6中底部的弧为求取的图像质心。

 
(点击查看大图)图18-6  简化的摆动模型

圆的方程为:

 

其中 为圆心。另一种方程描述为:  。其中, ,可以使用最小二乘方法计算参数 , , ,求取的圆半径即为摆长,图18-6中标出了圆心、半径和摆动轨迹。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多