求运动中的钟摆长度
这个例子向您展示了如何计算运动中的钟摆的长度。您可以使用图像采集工具箱™捕获时间序列中的图像,并使用图像处理工具箱™分析它们。
第一步:获取图像
加载运动中的钟摆的图像帧。mat文件中的帧pendulum.mat
使用图像采集工具箱中的以下功能进行采集。
访问图像采集设备(视频对象)。% vidimage = videoinput (winvideo, 1, ' RGB24_352x288 ');配置对象每五帧捕获一次。% vidimage。FrameGrabInterval = 5;%配置记录帧数。% nFrames = 50;% vidimage。FramesPerTrigger = nFrames;访问设备的视频源。% src = getselectedsource (vidimage);配置设备每秒提供30帧。% src。FrameRate = 30;打开实时预览窗口。将相机对准一个移动的钟摆。%预览(vidimage);发起收购。%开始(vidimage);等待数据日志记录完成后再检索数据。% wait(vidimage, 10);从内存中提取帧。% frames = getdata(vidimage);打扫卫生。删除并清除关联变量。%删除(vidimage)%清晰图像加载mat文件负载摆;
步骤2:用IMPLAY探索序列
运行以下命令查看implay
.
implay(帧);
步骤3:选择钟摆摆动的区域
您可以看到,钟摆在图像系列中每帧的上半部分摆动。创建一个新的框架系列,其中只包含钟摆摆动的区域。
用于裁剪一系列帧imcrop
,第一次表演imcrop
并存储它的输出图像。然后使用之前输出的大小来创建一系列帧区域。为方便起见,请使用矩形
这是由pendulum.mat
在imcrop
.
nFrames = size(frames,4);First_frame = frames(:,:,:,1);First_region = imcrop(first_frame,rect);frame_regions = repmat(uint8(0), [size(first_region) nFrames]);为数= 1:nFrames frame_regions(:,:,:,数)= imcrop(帧(::,:,计数),矩形);结束imshow(帧(:,:,:1))
第四步:在每一帧中分割摆
注意钟摆比背景暗很多。您可以通过将帧转换为灰度来分割每一帧中的摆,使用阈值imbinarize
,并删除背景结构使用imopen
而且imclearborder
.
初始化数组以包含分段摆帧。
seg_pend = false([size(first_region,1) size(first_region,2) nFrames]);中心点=零(nFrames,2);Se_disk = strel(“磁盘”3);为count = 1:nFrames fr = frame_regions(:,:,:,count);GFR = rgb2gray(fr);GFR =补体(GFR);Bw = imbinalize (gfr,.7);%阈值由实验确定Bw = imopen(Bw,se_disk);Bw = imclearborder(Bw);Seg_pend (:,:,count) = bw;蒙太奇({fr, labeloverlay(肾小球滤过率(gfr), bw)});暂停(0.2)结束
第五步:找到分段摆在每一帧的中心
你可以看到钟摆的形状在不同的坐标系中是不同的。这不是一个严重的问题,因为你只需要它的中心。你可以用钟摆的中心来计算钟摆的长度。
使用regionprops
来计算钟摆的中心。
pend_centers = 0 (nFrames,2);为count = 1:nFrames属性= regionprops(seg_pend(:,:,count),“重心”);pend_centers(count,:) = property.Centroid;结束
显示钟摆中心情节
.
X = pend_centers(:,1);Y = pend_centers(:,2);图绘制(x, y,“m”。)轴ij轴平等的持有在;包含(“x”);ylabel (“y”);标题(“摆中心”);
第六步:通过钟摆中心拟圆计算半径
重写圆的基本方程:
(x-xc)²+ (y-yc)²=半径²
在哪里(xc、yc)
中心是参数的形式吗一个
,b
,c
作为
X²+ y²+ a* X + b*y + c = 0
在哪里A = -2*xc
,B = -2*yc
,C = xc²+ yc²- radius²
.
你可以解出参数一个
,b
,c
用最小二乘法。将上式改写为
A *x + b*y + c = -(x²+ y²)
也可以写成
[x y 1] * [a;b;c] = -x^2 - y^2
.
使用反斜杠(\
)算子。
圆半径是钟摆的长度,以像素为单位。
ABC = [x y ones(length(x),1)] \ -(x.)²+ y.²);A = abc(1);B = abc(2);C = abc(3);Xc = -a/2;Yc = -b/2;Circle_radius =√((xc^2 + yc^2) - c);Pendulum_length = round(circle_radius)
Pendulum_length = 253
将圆和圆心叠加在摆心图上。
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;情节(x_fit y_fit,“b -”);情节(xc、yc“软”,“线宽”2);Plot ([xc x(1)],[yc y(1)],“b -”);文本(xc - 110, yc + 100, sprintf ('摆长度= %d像素'pendulum_length));
另请参阅
regionprops
|imclearborder
|imopen
|imbinarize
|imcomplement
|labeloverlay