1

私はMatlab処理が初めてで、「forループ」内(またはループなし)で大きなビデオ(20万フレーム以上)を読み込んで処理したいと考えています。特に、私はしたいです:

  1. VideoReader でビデオを読み、
  2. ビデオをそれぞれ 1000 フレームの n エポックに分割し、
  3. 1000 フレームのすべてのエポックを処理し、読み取り: エポックの最初のフレーム、2 つスキップ、フレームの読み取り、2 つスキップなど (たとえば、i=1:3:nFrames)、
  4. すべてのエポックを考慮して、読み取ったすべての「RGBフレーム」をim2bwに変換する必要があります
  5. 変換後、最初のビデオ フレーム ("mov(1,1).cdata") とエポック内で読み取られたすべてのフレームを考慮して、"corr2" 2D 相互相関を作成する必要があります。
  6. 「corr2」からの結果をベクトルに格納します。

要約すると、これは私がする必要があることです。皆さん、ありがとうございました


これは、「corr2」について、これまでのところ私が持っているものです:

for frame_ind = 1 : nFrames
  mov(frame_ind).cdata = im2bw(rgb2gray(read(xyloObj,frame_ind)),0.20);      
end

%% Corr2 to compare BW video frames
for frame_ind2 = 1:(frame_ind-1)
    R(frame_ind2)=corr2(mov(1,frame_ind2).cdata,mov(1,frame_ind2+1).cdata);
end

 TF= isnan(R); 
 g=sum(TF);
 f=(length(R)-g);


if (g~=(length(R))) 
  %%If Part has errors 
  disp('"Part_1" has video interferences/noise/problems, see "Testresult.txt" for more information.');
 else 
  %%If Part has not errors  
  displ=strcat('"Part_1" has not video interferences/noise/problems.');
 end
4

2 に答える 2

1
于 2012-07-30T15:04:38.447 に答える
0
% create video handle and get number of frames
vidObj = VideoReader(video_file);
nFrames = get(vidObj, 'NumberOfFrames');

blocksize = 1000;
BlocksIDs = 1:blocksize:nFrames;
nBlocks = numel(BlocksIDs);

frame_step = 3;

% cell array with all correlations values grouped by block
xcorrs_all_blocks = cell(1, nBlocks);

for j = 1 : nBlocks

    % if this is the last block, process until the last frame
    if j == nBlocks
        last_frame = nFrames;
    % otherwise, read until next block
    else
        last_frame = BlocksIDs(j + 1);
    end
    % compute the frame numbers that we want to look at
    frame_indices = BlocksIDs(j) : frame_step : last_frame;
    nFrames = numel(frame_indices);

    first_frame = [];
    % pre-allocate array holding the in-block corr2 values.
    xcorrs_this_block = nan(1, nFrames-1);

    for k = 1 : nFrames

        % read-in raw frame from video file.
        raw_frame = read(vidObj, frame_indices(k));            
        % determine level for bw conversion - this might help.
        level = graythresh(raw_frame);
        raw_frame = im2bw(raw_frame, level);

        if k == 1
            % save current frame as first frame for later corr2 processing
            first_frame = raw_frame;
        else
            % calc the correlation between the first frame in the block and each successive frame
            xcorrs_this_block(k-1) = corr2(first_frame, raw_frame);
        end


    end

    % save all xcorr values into global cell array.
    xcorrs_all_blocks{j} = xcorrs_this_block;

end
于 2012-07-30T13:57:32.953 に答える