主要内容

计算运动中的钟摆长度

这个例子展示了如何捕捉和分析运动物体的图像。

这个例子捕捉了运动中的钟摆的图像。钟摆由一个蓝色的球和一根尼龙绳组成。当摆摆摆动时,图像数据被捕获。一旦捕获,图像将被处理以确定钟摆的长度。

使用图像采集工具箱™获取图像,并使用图像处理工具箱™进行分析。

获取图像

获取一系列图像进行分析。

访问图像采集设备。视频输入(“winvideo”, 1“RGB24_352x288”);从视频。超时= 12;配置对象每五帧捕获一次。从视频。FrameGrabInterval = 5;%配置记录帧数。从视频。FramesPerTrigger = 50;访问所选的设备视频源对象进行采集。SRC = getselectedsource(vid);%将设备配置为每秒提供30帧。src。帧速率=“30”打开实时预览窗口。将相机对准一个移动的钟摆。预览(vid);发起收购。开始(vid);从内存中提取帧。帧= getdata(vid);从内存中删除视频输入对象。删除(vid)清晰从视频显示系列中的第一帧。Imshow (frames(:,:,:, 1));

显示所有获取的图像。imaqmontage(帧);

选择感兴趣的地区

由于钟摆的运动局限于图像序列的上半部分。创建包含感兴趣区域的一系列新的框架。

用于裁剪一系列帧imcrop,第一次表演imcrop并存储它的输出。然后创建一系列具有前面输出大小的帧。

确定获取的帧总数。nFrames = size(frames, 4);裁剪第一帧。ROI = [50 16 222 68];firstFrame = frames(:,:,:,1);framerregion = imcrop(firstFrame, roi);为修改后的映像系列创建一个存储。regions = repmat(uint8(0), [size(framerregion) nFrames]);数= 1:nFrames、地区(:,:,:,数)= imcrop(帧(::,:,计数),roi);imshow(地区(:,:,:,));结束

在每帧中分割摆

由于钟摆比背景暗得多,通过将帧转换为灰度,对其进行阈值,并去除背景结构,可以在每一帧中分割钟摆。

初始化数组以包含分段摆帧。segend = false([size(framerregion, 1) size(framerregion, 2) nFrames]);中心点=零(nFrames, 2);structDisk = strel(“磁盘”3);count = 1:nFrames,%转换为灰度。Fr = regions(:,:,:,count);GFR = rgb2gray(fr);GFR =补体(GFR);通过实验确定阈值。Bw = im2bw(gfr, .7);bw = imopen(bw, structDisk);Bw = imclearborder(Bw);segend (:,:,count) = bw;imshow (bw);结束

求出每个分段摆的中心

在每一帧中分段摆的形状不是一个严重的问题,因为摆的中心是确定摆的长度所需要的唯一特征。

计算钟摆中心。count = 1:nFrames, property = regionprops(segend (:,:, count),“重心”);pendCenters(count,:) = property.Centroid;结束%显示钟摆中心并调整图。图;x = pendCenters(:, 1);y = pendCenters(:, 2);情节(x, y,“m”。);轴ij;轴平等的;持有;包含(“x”);ylabel (“y”);标题(“摆中心”);

计算摆长

通过在钟摆中心拟合一个圆,可以计算出钟摆的长度。重写圆的基本方程:

  • (x-xc)²+ (y-yc)²=半径²

其中(xc,yc)为中心,用参数a, b, c表示:

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

地点:

  • A = -2*xc

  • B = -2*yc

  • C = xc²+ yc²- radius²。

用最小二乘法求解参数a、b、c,可将上式改写为:

  • A *x + b*y + c = -(x²+ y²)

也可以改写为:

  • [一个;b;C] * [xy 1] = -x^2 - y^2

这个方程可以在MATLAB®中使用反斜杠(\)运算符求解。

解这个方程。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;circleRadius =√((xc^2 + yc^2) - c);%圆半径为钟摆的长度,单位为像素。pendulumLength = round(circleRadius)
pendulumLength = 253
将结果叠加到钟摆中心。Circle_theta = pi/3:0.01:pi*2/3;x_fit = circleadius *cos(circle_theta) + xc;y_fit = circleadius *sin(circle_theta) + yc;情节(x_fit y_fit,“b -”);情节(xc、yc“软”“线宽”2);Plot ([xc x(1)], [yc y(1)],“b -”);标题str = sprintf('摆长度= %d像素', pendulumLength);text(xc-110, yc+100,标题str);