主要内容

求运动中的摆的长度

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

步骤1:获取图像

加载运动中的钟摆的图像帧。mat文件中的帧pendulum.mat使用图像采集工具箱中的以下函数获取。

%访问图像采集设备(视频对象)。% vidimage = videoinput (winvideo, 1, ' RGB24_352x288 ');%配置对象捕捉每五帧。% vidimage。FrameGrabInterval = 5;%配置记录帧数。% nFrames = 50;% vidimage。FramesPerTrigger = nFrames;%访问设备的视频源。% src = getselectedsource (vidimage);%配置设备每秒提供30帧。% src。帧速率= 30;打开实时预览窗口。把相机聚焦到一个移动的钟摆上。%预览(vidimage);发起收购。%开始(vidimage);%等待数据日志记录完成后再检索数据。%等(vidimage 10);%从内存中提取帧。%帧= getdata(图像);%清理。删除和清除关联的变量。%删除(vidimage)%明显vidimage%负载MAT-file负载

步骤2:用IMPLAY探索序列

运行如下命令查看implay

implay(帧);

步骤3:选择钟摆摆动的区域

你可以看到,在图像系列的每一帧的上半部分,钟摆正在摆动。创建一个新的框架系列,只包含钟摆摆动的区域。

用。来裁剪一系列的帧imcrop第一次执行imcrop并存储其输出图像。然后使用前面输出的大小创建一系列帧区域。为了方便,请使用矩形装载了pendulum.matimcrop

nFrames =大小(框架,4);first_frame =帧(:,:,:1);first_region = imcrop (first_frame、矩形);frame_regions = repmat(uint8(0), [size(first_region) nFrames]);数= 1:nFrames frame_regions(:,:,:,数)= imcrop(帧(::,:,计数),矩形);结束imshow(帧(:,:,:1))

步骤4:在每一帧分割钟摆

注意,钟摆比背景暗得多。你可以在每一帧中分割钟摆,通过将帧转换为灰度,使用阈值imbinarize,删除背景结构使用imopenimclearborder

初始化数组以包含分段摆架。

seg_pend = false([size(first_region,1) size(first_region,2) nFrames]); / /指定帧大小质心= 0 (nFrames, 2);se_disk = strel (“磁盘”3);count = 1:nFrames fr = frame_regions(:,:,:,count);肾小球滤过率(gfr) = rgb2gray (fr);肾小球滤过率(gfr) = imcomplement (gfr);bw = imbinarize(肾小球滤过率(gfr)、7);%阈值由实验确定bw = imopen (bw, se_disk);bw = imclearborder (bw);seg_pend(:,:,数)= bw;蒙太奇({fr, labeloverlay(肾小球滤过率(gfr), bw)});暂停(0.2)结束

步骤5:在每一帧中找到分段摆的中心

你可以看到钟摆的形状在不同的框架中是不同的。这不是一个严重的问题,因为你只需要它的中心。你要用钟摆的中心来求钟摆的长度。

使用regionprops来计算钟摆的中心。

pend_centers = 0 (nFrames, 2);nFrames属性= regionprops(seg_pend(:,:,count),“重心”);pend_centers(计数:)= property.Centroid;结束

显示摆中心使用情节

x = pend_centers (: 1);y = pend_centers (:, 2);图绘制(x, y,“m”。)轴ij平等的持有;包含(“x”);ylabel (“y”);标题(“摆中心”);

步骤6:通过钟摆中心拟合一个圆来计算半径

重写圆的基本方程:

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

在哪里(xc、yc)在参数方面,中心是什么一个bc作为

X ^2 + y^2 + a* X + b*y + c = 0

在哪里= 2 *我b = 2 * yc,C = xc^2 + yc^2 -半径^2

你可以求解参数一个b,c用最小二乘法。将上面的方程重写为

A *x + b*y + c = -(x^2 + y^2)

也可以写成

[a;b;c] = -x^2 - y^2

使用反斜杠()算子。

圆半径是钟摆的长度,单位为像素。

ABC = [x y ones(length(x),1)] \ -(x。^ 2 + y ^ 2);一个= abc (1);b = abc (2);c = abc (3);xc =——/ 2;yc = - b / 2;Circle_radius =√((xc^2 + yc^2) - c);pendulum_length =圆(circle_radius)
pendulum_length = 253

将圆和圆的圆心重叠在摆的圆心图上。

circle_theta =π/ 3:0.01:π* 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);情节(xc x (1), (yc y (1)),“b -”);文本(xc - 110, yc + 100, sprintf ('钟摆长度= %d像素'pendulum_length));

另请参阅

|||||