主要内容

求运动中的钟摆长度

这个例子向您展示了如何计算运动中的钟摆的长度。您可以使用图像采集工具箱™捕获时间序列中的图像,并使用图像处理工具箱™分析它们。

第一步:获取图像

加载运动中的钟摆的图像帧。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.matimcrop

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)中心是参数的形式吗一个bc作为

X²+ y²+ a* X + b*y + c = 0

在哪里A = -2*xcB = -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));

另请参阅

|||||