早急に(12/8,9​くらいまで)ご回答お​願いいたします。fo​r文の書き方について​です。

3 views (last 30 days)
hiro
hiro on 4 Dec 2020
以下の二つのコードをうまく組み合わせて122フレームの動画を30フレームの動画にしたいと考えています。30フレームの取り方は、4フレームに1つ、等間隔に取るようにして、さらに、その取る1フレームは、4フレームの中で1番エッジがはっきりしているフレーム(二つ目のコードのSM(ii)のスカラー値の値が一番大きいフレーム)にしたいです。
以下に二つのコードの説明と自分の考えを書きました。
vid0bj = VideoReader('image1-1.avi');
mkdir workingDir
ii = 1;
while hasFrame(vid0bj)
img = readFrame(vid0bj);
filename = [sprintf('%03d', ii) '.jpg'];
fullname = fullfile('workingDir', filename);
imwrite(img, fullname)
ii = ii+1;
end
imageNames = dir(fullfile('workingDir', '*.jpg'));
imageNames = {imageNames.name}';
outputVideo = VideoWriter(fullfile('workingDir', 'image1-1kai.avi'));
outputVideo.FrameRate = vid0bj.FrameRate;
open(outputVideo)
NumFrame = length(imageNames);
SampleRate = round(NumFrame/30);
jj = 0;
for ii = 1:NumFrame
if mod(jj,SampleRate) == 0
img = imread(fullfile('workingDir', imageNames{ii}));
writeVideo(outputVideo,img);
jj = 0;
end
jj = jj + 1;
end
close(outputVideo)
vid0bjavi = VideoReader(fullfile('workingDir, 'image1-1kai.avi'));
ii = 1;
while hasFrame(vid0bjavi)
mov(ii) = im2frame(readFrame(vid0bjavi));
ii = ii+1;
end
figure
imshow(mov(1).cdata, 'Border', 'tight')
movie(mov,1,vid0bjavi.FrameRate)
上記の1つ目のコードを実行すると、'image1-1.avi'という122フレームの白黒動画ファイルから'001.jpg'~'122.jpg'の白黒画像ファイルを作り、4フレームに1フレーム、等間隔に白黒画像ファイルを読み込み、'image1-1kai.avi'という30フレームの白黒動画ファイルが作られます。
for ii = 1:122
ImgName = sprintf('%03d.jpg', ii);
I = imread(ImgName);
BW= edge(I, 'Canny');
NZ = BW.^2;
BT = NZ(:);
SM(ii) = sum(BT);
end
上記の2つ目のコードを実行すると'001.jpg'~'122.jpg'の白黒画像のエッジが検出され、最終的にエッジ画像の各要素の2乗の総和が1つのスカラー値として出力されます。
自分の考えとしては、for ii= 1:4:121のように書き始めてfor文を作っていけばいいと考えていますが、どう作っていけばいいのかわかりません。12月8、9日あたりまでにはコードを完成させたいので早急に具体的なコードを提示していただけると幸いです。よろしくお願いいたします。

Answers (0)

Community Treasure Hunt

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

Start Hunting!