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

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

 채택된 답변

Hiroshi Iwamura
Hiroshi Iwamura 2023년 5월 10일
이동: Atsushi Ueno 2023년 5월 11일

1 개 추천

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

巧 平山
巧 平山 2023년 5월 10일
이동: Atsushi Ueno 2023년 5월 11일
この方法で作成できるのはVideoreaderオブジェクトであるため、structオブジェクトの事前割り当てとしては不適当でした。
structを作成する等、異なるアプローチで事前割り当てを行うことは可能でしょうか?????
Hiroshi Iwamura
Hiroshi Iwamura 2023년 5월 10일
이동: Atsushi Ueno 2023년 5월 11일
ビデオは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)
巧 平山
巧 平山 2023년 5월 11일
이동: Atsushi Ueno 2023년 5월 11일
事前割り当てできました!ありがとうございます!!
僕の説明が悪くて2度手間になってしまいましたが、丁寧な説明有難うございました。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

제품

릴리스

R2023a

태그

질문:

2023년 5월 10일

이동:

2023년 5월 11일

Community Treasure Hunt

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

Start Hunting!