動いている振子の長さを検出
この例では,動いている振子の長さを計算する方法を示します。图像采集工具箱™で時系列のイメージをキャプチャし,图像处理工具箱™でキャプチャしたイメージを解析します。
手順1:@ @メ,@ @ジの取得
動いている振子のメジフレムを読み込みます。图像采集工具箱の以下の関数を使用して,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
を使用して一連のフレムをトリミングするには,最初に1のフレムに関数imcrop
を実行し,その出力。次に,前の出力のサ,ズを使用して,一連のフレ,ム領域を作成します。便宜上、関数imcrop
のpendulum.mat
によって読み込まれた矩形
を使用します。
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))
手順4:各フレ,ムでの振子のセグメント化
振子は背景よりも暗くなっていることに注目してください。フレ,ムをグレ,スケ,ルに変換し,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)结束
手順5:各フレ,ムでセグメント化された振子の中心の検出
フレ,ムによって振子の形状が異なっていることがわかります。必要なのは振子の中心のみなので,これは重大な問題ではありません。振子の中心を使用して,振子の長さを検出します。
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”);标题(“摆中心”);
手順6:振子の中心を介した円の近似による半径の計算
以下の円の基本方程式を書き換えます。
(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