opticalFlowLKの出力を用いてQuiverプロットを行いたい
Mostrar comentarios más antiguos
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 comentarios
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
巧 平山
el 11 de Mayo de 2023
Atsushi Ueno
el 11 de Mayo de 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
巧 平山
el 16 de Mayo de 2023
巧 平山
el 17 de Mayo de 2023
Atsushi Ueno
el 7 de Jun. de 2023
コメント遅くなりました。「内容を理解したら追記します」と書きましたが、当時も良く分からないまま追記しましたし、もうすっかり忘れてしまいました。
現在のカラーマップ(デフォルトで64色のグラデーション)の色数をビン数として、矢印の長さを各ビンに分配します。つまり、矢印の長さに応じた色を決めています。この色を全ての矢印(矢じりと軸に分かれたプロパティ)各々に対し設定しています。
Respuestas (0)
Categorías
Más información sobre 追跡と動き推定 en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
