opticalFlo​wLKの出力を用いて​Quiverプロット​を行いたい

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座標も同サイズにするのが良いと思います。
それよりも quiver 関数で矢印を1本ずつ描くのはちょっと遅過ぎて、いけてないですね。
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
ベクトルの長さ毎に色を変化させたいのでquiver関数をつかっています。
plotでは上手くいかないためこのような手段を取っているのですが、
出力を速くする別の手段はございますでしょうか??
Atsushi Ueno
Atsushi Ueno on 11 May 2023
>出力を速くする別の手段はございますでしょうか??
あります。普通にquiver関数で複数の矢印を纏めて一回で描画した後、個々の矢印の色を設定します。
昔(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
Atsushi Ueno on 7 Jun 2023
コメント遅くなりました。「内容を理解したら追記します」と書きましたが、当時も良く分からないまま追記しましたし、もうすっかり忘れてしまいました。
Quiver オブジェクトのプロパティ”Head”(矢じり部分)と”Tail”(矢の軸部分)は、quiverのプロパティの説明に登場しません。隠しプロパティなのではないかと思います。
現在のカラーマップ(デフォルトで64色のグラデーション)の色数をビン数として、矢印の長さを各ビンに分配します。つまり、矢印の長さに応じた色を決めています。この色を全ての矢印(矢じりと軸に分かれたプロパティ)各々に対し設定しています。

Sign in to comment.

Answers (0)

Products

Release

R2023a

Asked:

on 10 May 2023

Commented:

on 7 Jun 2023

Community Treasure Hunt

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

Start Hunting!