早急に(12/8,9くらいまで)ご回答お願いいたします。for文の書き方についてです。
1 view (last 30 days)
Show older comments
以下の二つのコードをうまく組み合わせて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日あたりまでにはコードを完成させたいので早急に具体的なコードを提示していただけると幸いです。よろしくお願いいたします。
0 Comments
Answers (0)
See Also
Categories
Find more on オブジェクト解析 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!