文档

计算一个钟摆运动的长度

这个例子展示了如何捕获和分析对象的图像。

这个例子的钟摆运动捕捉影像。钟摆由一个蓝色球连着一个尼龙弦。天平是图像数据捕获。一旦被俘,图像处理来确定摆的长度。

图像获得使用图像采集与图像处理工具箱™和分析工具箱™。

获取图像

获得一系列的图像分析。

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

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

选择感兴趣的区域

由于摆的运动局限于图像的上半部分系列。创建一个新的一系列帧包含感兴趣的地区。

作物一系列帧使用imcrop第一次执行imcrop上一帧和存储它的输出。然后创建一系列的帧的大小之前输出。

%确定帧的总数。nFrames =大小(框架,4);%作物第一帧。投资回报率= (50 222 68);firstFrame =帧(:,:,:1);frameRegion = imcrop (firstFrame roi);%为修改后的图像创建一个存储系列。区域= repmat (uint8(0)[大小(frameRegion) nFrames]);数= 1:nFrames、地区(:,:,:,数)= imcrop(帧(::,:,计数),roi);imshow(地区(:,:,:,));结束

段每一帧的钟摆

自摆比背景要暗许多,每一帧的钟摆可以分段转换帧灰度,阈值,去除背景结构。

%初始化数组包含分段摆帧。segPend = false([大小(frameRegion, 1)大小(frameRegion 2) nFrames]);质心= 0 (nFrames, 2);structDisk = strel (“磁盘”3);数= 1:nFrames,%转换为灰度。fr =区域(:,:,:,数);肾小球滤过率(gfr) = rgb2gray (fr);肾小球滤过率(gfr) = imcomplement (gfr);%实验确定阈值。bw = im2bw(肾小球滤过率(gfr)、7);bw = imopen (bw, structDisk);bw = imclearborder (bw);segPend(:,:,数)= bw;imshow (bw);结束

找到每个分段摆的中心

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

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

摆的长度计算

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

  • (x-xc) ^ 2 + (y-yc) ^ 2 = r ^ 2

(xc、yc)中心,用参数a, b, c:

  • x ^ 2 + y ^ 2 + x + b * * y + c = 0

地点:

  • = 2 *我

  • b = 2 * yc

  • c = xc ^ 2 + yc ^ 2 -半径^ 2。

求解参数a、b和c使用最小二乘方法,上述方程可以写成:

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

也可以写成:

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

这个方程可以解决在MATLAB®使用反斜杠(\)操作符。

%解方程。abc = [x y的(长度(x), 1)) \ [(x。^ 2 + y ^ 2)];一个= abc (1);b = abc (2);c = abc (3);xc =——/ 2;yc = - b / 2;circleRadius =√(xc ^ 2 + yc ^ 2) - c);%圆半径的长度是像素的钟摆。pendulumLength =圆(circleRadius)
pendulumLength = 253
%到摆中心重叠的结果circle_theta =π/ 3:0.01:π* 2/3;x_fit = circleRadius * cos (circle_theta) + xc;y_fit = circleRadius * sin (circle_theta) + yc;情节(x_fit y_fit,“b -”);情节(xc、yc“软”,“线宽”2);情节(xc x (1), (yc y (1)),“b -”);titleStr = sprintf (“摆长度= % d像素”,pendulumLength);文本(xc - 110, yc + 100, titleStr);