動画の上にベクトル場で流速分布を表示したい

7 views (last 30 days)
巧 平山
巧 平山 on 26 Apr 2023
Commented: 巧 平山 on 4 Aug 2023
オプティカルフローのテンプレートopenExample('vision/viptrafficofExample')を用いて,動画上で稲の籾のオプティカルフローを解析しています。
しかし,テンプレートの自動車のようにうまくいきません。添付画像のように全体的に物が動いているため,矢印を沢山書くだけでは見にくい画像になっています。従って,動画の上にベクトル場を作成し,流速分布で表示したいと考えています。
しかし,ベクトル場作成はプロットでのみとなっているため,動画の上に重ねて表示する方法が分かりません。どのようにすれば,動画の上に流速分布を表示できますか??

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 26 Apr 2023
>どのようにすれば,動画の上に流速分布を表示できますか??
動画を1フレームずつ表示し、その上に流速分布のプロットが可能です。
動画ファイルの読み取りや書き出しは専用の関数群で実行できます。
[X,Y] = meshgrid(pi/8:pi/8:2*pi,pi/8:pi/8:pi);
U = 100 * sin(Y); V = 100 * cos(X);
imshow(imread('peppers.png')); % サンプル画像
hold on
quiver(X*100,Y*100,U,V,'y'); % 流速分布のサンプルを重ねてプロット
  4 Comments
巧 平山
巧 平山 on 8 May 2023
返信ありがとうございました。非常に参考になりました。
巧 平山
巧 平山 on 4 Aug 2023
追加の質問になります。
作成した画像をつなげて動画を作成しました。しかし、いくつか動画を作成した際に、colormapの範囲が異なっていることに気づいてclim関数を利用しましたが、画像情報が消えて上手く動作しませんでした。
解決法が有れば教えて頂きたいです。
tic
f_name_base = [pwd];
colormap jet
cmap=colormap;
for id =400:998
str_id = num2str(id, '%i');
frame=[f_name_base, str_id, '.jpg'];
F=imread(frame);
imshow(frame);
hold on;
X = zeros(1280,1,998);Y = zeros(1280,1,998);U = zeros(1280,1,998);V = zeros(1280,1,998) ;L = zeros(1280,1,998) ;M = zeros(1280,1,998) ;
X(:,1,id)=Mat(:,1,id);
Y(:,1,id)=Mat(:,2,id);
U(:,1,id)=Mat(:,3,id);
V(:,1,id)=Mat(:,4,id);
L(:,1,id)=hypot(U(:,1,id),V(:,1,id));L(:,1,id)=L(:,1,id).*10;
M(:,1,id)=round(L(:,1,id),0);M(:,1,id)=M(:,1,id)+1;
for k = 1:1280 % 流速分布のサンプルを重ねてプロット
quiver(X(k,1,id),Y(k,1,id),U(k,1,id),V(k,1,id),'Color',cmap(ceil(M(k,1,id)),:),'linewidth',2);
end
filename = [sprintf('%03d',id) '_quiver.jpg'];%テキストファイル名
fullname = fullfile(f_name_base,filename);%保存ファイルにパスをつなげる
ax=gca;
exportgraphics(ax,fullname) % JPEG fileで書き出す (※名前;img1.jpg, img2.jpg, etc.)
hold off
end

Sign in to comment.

More Answers (0)

Products


Release

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!