Clear Filters
Clear Filters

struct を高速化のため事前割り当てしたい。

12 views (last 30 days)
巧 平山
巧 平山 on 10 May 2023
Moved: Atsushi Ueno on 11 May 2023
ビデオの読み取りをして表示を行っています。
i=1;
while hasFrame(Movie)
DisplayMov(i) = im2frame(readFrame(Movie)); ←事前割当をしたい
i = i + 1
end
変数サイズがループごとに変更されているため事前割当をしたいのですが,structに任意の数字を行列で入れることはdouble→structが出来ないため出来ません。
他に事前割当を行う方法はないですか

Accepted Answer

Hiroshi Iwamura
Hiroshi Iwamura on 10 May 2023
Moved: Atsushi Ueno on 11 May 2023
VideoReader オブジェクトを作成すれば簡単にできるかと思います。
videoObject = VideoReader('xylophone.mp4')
videoObject =
VideoReader with properties: General Properties: Name: 'xylophone.mp4' Path: '/MATLAB/toolbox/matlab/audiovideo' Duration: 4.7000 CurrentTime: 0 NumFrames: <Calculating...> learn more Video Properties: Width: 320 Height: 240 FrameRate: 30 BitsPerPixel: 24 VideoFormat: 'RGB24'
videoAll = read(videoObject);
size(videoAll)
ans = 1×4
240 320 3 141
startFrame = 100; endFrame = 110;
videoParts = read(videoObject,[startFrame endFrame]);
size(videoParts)
ans = 1×4
240 320 3 11
imshow(videoParts(:,:,:,1))
  3 Comments
Hiroshi Iwamura
Hiroshi Iwamura on 10 May 2023
Moved: Atsushi Ueno on 11 May 2023
ビデオは1-3次元目までが固定サイズなので通常の mat になっていれば良いと思ったのですが、movie() とかで再生したいと言うことですかね?
struct の事前割り当ては videoObject.NumFrames を使えばできます。
videoObject = VideoReader('xylophone.mp4');
DisplayMov(videoObject.NumFrames) = struct('cdata',[],'colormap',[])
DisplayMov = 1×141 struct array with fields:
cdata colormap
i=1;
while hasFrame(videoObject)
DisplayMov(i) = im2frame(readFrame(videoObject));
i = i + 1;
end
disp(i-1)
141
axis off
movie(DisplayMov)
巧 平山
巧 平山 on 11 May 2023
Moved: Atsushi Ueno on 11 May 2023
事前割り当てできました!ありがとうございます!!
僕の説明が悪くて2度手間になってしまいましたが、丁寧な説明有難うございました。

Sign in to comment.

More Answers (0)

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!