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

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

 채택된 답변

Atsushi Ueno
Atsushi Ueno 2023년 4월 26일

0 개 추천

>どのようにすれば,動画の上に流速分布を表示できますか??
動画を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

巧 平山
巧 平山 2023년 4월 27일
回答ありがとうございました。
フレームごとの結果をつなぎ合わせて欲しい動画を作成できそうです。
加えて質問させて頂きたいのですが、ベクトルの長さ(速度)に応じて色を変化させることは可能でしょうか??
速度ベクトルが小さいほど紫に、大きいほど赤になるようにベクトルを描画したいです。
Atsushi Ueno
Atsushi Ueno 2023년 4월 29일
下記の様に矢印を一つずつ書けば手っ取り早いですが、矢印の長さ自動調整など 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
巧 平山
巧 平山 2023년 5월 8일
返信ありがとうございました。非常に参考になりました。
巧 平山
巧 平山 2023년 8월 4일
追加の質問になります。
作成した画像をつなげて動画を作成しました。しかし、いくつか動画を作成した際に、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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 コンピューター ビジョンと Simulink에 대해 자세히 알아보기

제품

릴리스

R2023a

질문:

2023년 4월 26일

댓글:

2023년 8월 4일

Community Treasure Hunt

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

Start Hunting!