videoWriterによる動画出力の高速化について
조회 수: 32 (최근 30일)
이전 댓글 표시
対象物の自動検出と追従する動画解析を行っています。解析して対象物に色を塗ったり、線を書き加えるなどして動画出力をしています。
動画出力する際に、どうしても時間を要すために、高速化の方法があればご教授ください。
以下の方法は実践済です。
・フレームレイト調整
・MPEG-4での出力
・画像の縮小
★「imshow」を行うことに時間がかかっているのですが、これは外せないでしょうか・・・
★解析結果(対象物の座標)の取得のみまず行い、動画の作成は後で行うために別変数で保存する方法などもあればお教えください。
% 解析動画読み込み
vidObj = VideoReader("video.mp4");
% 出力動画ファイル
VideoWriter(strcat('trackSoftAlphaVer2_',sprintf(filename)),
% 1frameずつ読み込み&解析
while hasFrame(vidObj)
img = readFrame(vidObj);
~~~~~~~~~~~~~~~~~~~~~
% imgに対する解析
% 目標物の座標(X, Y)を算出
% 画像内の直線の軌跡(Line)を算出
~~~~~~~~~~~~~~~~~~~~~
figure('Visible', 'off');
imshow(img); hold on
scatter(X, Y);
plot(Line);
hold off
vidImg = getframe(gcf);
writeVIdeo(outVideo, vidImg);
end
댓글 수: 0
채택된 답변
Kojiro Saito
2024년 10월 17일
プロファイラーをかけてみたところ、imshowとgetframe、そしてfigureの処理時間が掛かっています。
現在のコードでは画像を表示してからscatterとplotをおこなっているので、getframeで画像を取得する必要があり、imshowも必要になります。figureは毎回作成する必要ないので、これをwhileの外に置くだけで処理時間がかなり速くなります。
figure('Visible', 'off');
% 1frameずつ読み込み&解析
while hasFrame(vidObj)
% TODO
end
また、Computer Vision Toolboxを使用できるならinsertShapeとinsertMarkerでplotとscatterに近いことができ、画像上に直接描けるのでより高速に実現できます。
vidObj = VideoReader("xylophone_video.mp4");
% 出力動画ファイル
outVideo = VideoWriter("out4.mp4", "MPEG-4");
open(outVideo)
figure('Visible', 'off');
% 1frameずつ読み込み&解析
while hasFrame(vidObj)
img = readFrame(vidObj);
%~~~~~~~~~~~~~~~~~~~~~
% imgに対する解析
% 目標物の座標(X, Y)を算出
% 画像内の直線の軌跡(Line)を算出
%~~~~~~~~~~~~~~~~~~~~~
X = randi(100);
Y = randi(100);
RGB = insertMarker(img, [X Y], "circle", MarkerColor="b");
lineData = reshape([0:100 0:100], [], 2);
RGB = insertShape(RGB, "line", lineData, ShapeColor="b");
writeVideo(outVideo, RGB);
end
close(outVideo)
댓글 수: 10
Kojiro Saito
2024년 10월 24일 0:40
座標軸 (axes)がFigure に対して余白を持つためですね。
参考: 座標軸のレイアウトの制御
ax1 を定義するところで、Positionプロパティで開始位置を0、横幅と縦幅を1に設定してFigure の全領域を使うように設定してみてください。
%ax1 = gca;
ax1 = axes(fig, 'Position', [0, 0, 1, 1]);
ax2 = axes(fig, 'Position', [0.75, 0.75, 0.2, 0.2]);
ax2 の位置がやや左寄りになってしまうので、こちらのPosition の値も調整してみました。
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 ビッグ データの処理에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!