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

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

 Accepted Answer

Atsushi Ueno
Atsushi Ueno on 26 Apr 2023

0 votes

>どのようにすれば,動画の上に流速分布を表示できますか??
動画を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 27 Apr 2023
回答ありがとうございました。
フレームごとの結果をつなぎ合わせて欲しい動画を作成できそうです。
加えて質問させて頂きたいのですが、ベクトルの長さ(速度)に応じて色を変化させることは可能でしょうか??
速度ベクトルが小さいほど紫に、大きいほど赤になるようにベクトルを描画したいです。
Atsushi Ueno
Atsushi Ueno on 29 Apr 2023
下記の様に矢印を一つずつ書けば手っ取り早いですが、矢印の長さ自動調整など quiver 関数の一部機能を使えなくなる難点があります。色情報の補間方法は上記のQ&Aを参考に真似しました。
[X,Y] = meshgrid(pi/8:pi/8:2*pi,pi/8:pi/8:pi);
U = sin(Y); V = cos(X); L = hypot(U,V); % Lは矢印の長さ
rgbMap = validatecolor(["#800080" "#ff0000"], "multiple"); % 紫:#800080、赤:#ff0000
cmap = interp1(1:2,rgbMap,linspace(1,2,256),'linear'); % 紫⇒赤256階調のカラーマップ作成
imshow(imread('peppers.png')); % サンプル画像
hold on
for k = 1:numel(X) % 流速分布のサンプルを重ねてプロット
quiver(X(k)*100,Y(k)*100,U(k)*20,V(k)*20,'Color',cmap(ceil(L(k)*128),:));
end
巧 平山
巧 平山 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!