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

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

Akzeptierte Antwort

Hiroshi Iwamura
Hiroshi Iwamura am 10 Mai 2023
Verschoben: Atsushi Ueno am 11 Mai 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 Kommentare
Hiroshi Iwamura
Hiroshi Iwamura am 10 Mai 2023
Verschoben: Atsushi Ueno am 11 Mai 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)
巧 平山
巧 平山 am 11 Mai 2023
Verschoben: Atsushi Ueno am 11 Mai 2023
事前割り当てできました!ありがとうございます!!
僕の説明が悪くて2度手間になってしまいましたが、丁寧な説明有難うございました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Logical finden Sie in Help Center und File Exchange

Produkte


Version

R2023a

Community Treasure Hunt

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

Start Hunting!