opticalFlowLKの出力を用いてQuiverプロットを行いたい
Show older comments
openExample('vision/ComputeOpticalFlowUsingLucasKanadeAlgorithmExample')を用いてLucas-Kanade アルゴリズムを使用したオプティカル フローの計算を行っています。
while hasFrame(vidReader)
frameRGB = readFrame(vidReader);
frameGray = im2gray(frameRGB);
flow = estimateFlow(opticFlow,frameGray);
imshow(frameRGB)
hold on
plot(flow,'DecimationFactor',[5 5],'ScaleFactor',10,'Parent',hPlot);
hold off
pause(10^-3)
end
7行目のオプティカルフロープロット関数をquiverで置きかえて
例えば
% カラーマップ作成
colormap jet ; cmap=colormap;
%プロットのメッシュ作成
borderOffset = 5;
decimFactorRow = 50;
decimFactorCol = 50;
%%
R = Mov.Height;
C = Mov.Width;
RV = borderOffset:decimFactorRow:(R-borderOffset);
CV = borderOffset:decimFactorCol:(C-borderOffset);
[Y, X] = meshgrid(CV,RV);
% オプティカルフローの計算
flow = estimateFlow(opticFlow,frameGray);
U = flow.Vx ; V = flow.V y; L = hypot(U,V);
% ベクトルをオプティカルフローの大きさに応じて変化させる
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
の様にベクトルを1本1本書いてそれぞれの色をオプティカルフローの大きさに応じて変化させたいと思っています。
しかし、単純な置き換えでは上手くいかず、
位置 1 のインデックスが無効です。配列インデックスは正の整数または logical 値でなければなりません。
のエラーが出てきます。
どの様に解決すれば宜しいでしょうか。
7 Comments
estimateFlowの出力は画像と同サイズで間引きも無いので、XY座標も同サイズにするのが良いと思います。
colormap jet ; cmap=colormap;% カラーマップ作成
vidReader = VideoReader('visiontraffic.avi','CurrentTime',11);
frameRGB = readFrame(vidReader);
H = height(frameRGB); % 360
W = width(frameRGB); % 640
[Y,X] = meshgrid(1:W,1:H);
opticFlow = opticalFlowHS;
if hasFrame(vidReader) % とりあえず1フレームだけ
frameRGB = readFrame(vidReader);
frameGray = im2gray(frameRGB);
flow = estimateFlow(opticFlow,frameGray); % オプティカルフローの計算
U = flow.Vx; V = flow.Vy; L = hypot(U,V);
imshow(frameRGB); hold on
for x = 1:10:W
for y = 1:10:H
quiver(x,y,U(y,x)*100,V(y,x)*100,'Color','w');%cmap(ceil(L(y,x)*128),:));
end
end
end
巧 平山
on 11 May 2023
Atsushi Ueno
on 11 May 2023
>出力を速くする別の手段はございますでしょうか??
昔(R2014a以前)は不可能だったらしいのですが、現在のMATLABでは可能になっているのだそうです。
以前の質問の時にも下記の記事を真似ようとしていたのですが...
内容を理解したら追記します。
colormap jet;
vidReader = VideoReader('visiontraffic.avi','CurrentTime',11);
frameRGB = readFrame(vidReader);
H = height(frameRGB); % 360
W = width(frameRGB); % 640
[Y,X] = meshgrid(1:W,1:H);
opticFlow = opticalFlowHS;
for k = 1:70
frameRGB = readFrame(vidReader);
frameGray = im2gray(frameRGB);
flow = estimateFlow(opticFlow,frameGray); % オプティカルフローの計算
U = flow.Vx; V = flow.Vy; L = hypot(U,V);
imshow(frameRGB); hold on
q = quiver(Y,X,U,V);
currentColormap = colormap(gca);
[~, ~, ind] = histcounts(L, size(currentColormap, 1));
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255);
cmap(:,:,4) = 255;
cmap = permute(repmat(cmap, [1 3 1]), [2 1 3]);
set(q.Head,'ColorBinding','interpolated','ColorData',reshape(cmap(1:3,:,:), [], 4).');
set(q.Tail,'ColorBinding','interpolated','ColorData',reshape(cmap(1:2,:,:), [], 4).');
end
巧 平山
on 16 May 2023
巧 平山
on 17 May 2023
Atsushi Ueno
on 7 Jun 2023
コメント遅くなりました。「内容を理解したら追記します」と書きましたが、当時も良く分からないまま追記しましたし、もうすっかり忘れてしまいました。
現在のカラーマップ(デフォルトで64色のグラデーション)の色数をビン数として、矢印の長さを各ビンに分配します。つまり、矢印の長さに応じた色を決めています。この色を全ての矢印(矢じりと軸に分かれたプロパティ)各々に対し設定しています。
Answers (0)
Categories
Find more on 追跡と動き推定 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
