2016-04-06 12 views
2

ビデオファイルから最後の10フレームを取得/登録/記憶する必要があります。これは、微表現を検出するためのより大きなプロジェクトの小さなバージョンです。したがって、最後の10フレーム(検出された)に対して「行」が表示されているか、または10行以上表示されていても検出されていないかどうかを確認する必要があります。私はまた、vision.VideoFileReadervision.OpticalFlowで作業するように強制されています。これを行う方法?Matlabの最後の10の数字/フレームの範囲

file = 'MEXTest.mp4'; 
vid = vision.VideoFileReader(file,'ImageColorSpace','RGB','VideoOutputDataType','single'); 
optFlo = vision.OpticalFlow('OutputValue','Horizontal and vertical components in complex form','ReferenceFrameDelay',3); 
shapeInsertOptFloColor = vision.ShapeInserter('Shape','Lines','BorderColor','Custom','CustomBorderColor',[255 255 0]); 

numFrames = 0; 
frameList = {}; 
hasLines = zeros(10, 1, 'logical'); 

figH = figure; 

while ~isDone(vid) 
    colorFrame = step(vid); 
    colorFrameRes = imresize(colorFrame,0.3); 
    grayFrame = rgb2gray(colorFrameRes); 

    optFloVectors = step(optFlo, grayFrame); 
    lines = oflo(optFloVectors,20); 
    motionVectors = step(shapeInsertOptFloColor, colorFrameRes, lines); 
    imshow(motionVectors); title('Optical Flow on Frame'); 

    notEmpty = ~isempty(lines); 
    if numel(notEmpty) ~= 1, notEmpty = 1; end 

    hasLines = [hasLines(2:end); notEmpty]; 

    if numFrames >= 10 
     frameList = [frameList(2:end) colorFrame]; 
    else 
     frameList = [frameList colorFrame]; 
    end 

    numFrames = numFrames + 1; 

    if numFrames >= 10 && all(hasLines) 
     disp('Micro-Expression Detected') 
    else 
     disp('Not detected') 
    end 

    if ~ishghandle(figH) 
     close all 
     break 
    end 
end 
release(vid); 
+2

だから、あなたは何を求めているのですか?現在のポイントよりも前に読み込まれたビデオの最後の10フレームを覚えていますか? – rayryeng

+0

'isempty(points)== false' - >'〜isempty(points) ' –

+0

はい、申し訳ありませんが正しく表現していないのです。 – UZIERSKI

答えて

4

あなたがやろうとしているすべての任意のポイントは、最後の10枚のフレームのそれぞれで発見されているかどうかを調べる、あなたはこのような何かを行うことができている場合:

vid = vision.VideoFileReader('MEXTest.mp4','ImageColorSpace','Intensity','VideoOutputDataType','uint8'); 

numFrames = 0; 

frameList = {} 
hasPoints = zeros(10, 1, 'logical') 

while ~isDone(vid) 
    frame = step(vid); 
    points = detectMinEigenFeatures(frame); 

    notEmpty = ~isempty(points) 
    if numel(notEmpty) ~= 1, notEmpty = 1; end 

    % Do the check for 10 frames before this step 
    % if you want to exclude the current frame from the 10 
    hasPoints = [hasPoints(2:end); notEmpty] 

    % Stashing the frames may not be necessary, this 
    % just shows how to build up a circular buffer 
    if numFrames >= 10 
     frameList = [frameList(2:end) frame] 
    else 
     frameList = [frameList frame] 
    end 

    % Count last frame now that it has been added 
    numFrames = numFrames + 1; 

    if numFrames >= 10 && all(hasPoints) 
     disp('Detected') 
    else 
     disp('Not Detected') 
    end 
end 
release(vid) 

循環バッファframeList意志最後の10フレームを記録します。そのステップは本当に重要ではありません。重要なことは、最後の10フレームのそれぞれについて~isempty(points)に等しいフラグを記憶するhasPointsである。 all(hasPoints)が真である場合、最後の10フレームのすべてが機能を検出しました。

このソリューションは、累積配列を繰り返し再割り当てするため、超効率的ではありませんが、循環バッファ用のthisソリューションを使用する10フレームでのみそうです。彼らは早すぎる最適化に関して彼らが言うことを知っています。

すべての場合にポイントが望ましいかどうかはチェックしません。最後の10フレームにはいくつかのポイントが検出されています。あなたのコメントから、これは受け入れられる解釈であるように見えます。

+0

それは私に14行目のエラーを与えます - 連結されている行列の次元は一貫していません。この '〜isempty(points)'を連結するのではなく、2番目のif文(別のAND演算子を追加)に移動できますか?これは私に同じ出力を与えるだろうか? – UZIERSKI

+0

これを連結してリストに追加し続ける必要があります。そうしないと、前のフレームに情報が蓄積されません。 'size(isempty(points))とは何ですか? –

+0

サイズは225です。表示されている場合は4です – UZIERSKI

1

私はビデオではあまり働いていませんが、一般的な手順は構造体の配列に格納することです。フレームならば呼び出し、その後、あなたがそれを初期化することができます

frames(10) = struct('prob1',0,'prob2',0,...,'probn',0); 

prob1、prob2、...、probnは、保存したいフレームのプロパティです。その後、フレームを読み込むたびに、同じ方法でそのフレームのプロパティを構造体フレームに保存します。

frame = struct('prob1',val1,'prob2',val2,...,'probn',valn); 

ここで、val1、val2、...、valnは、マトリックスとしてのフレームを含むすべてのものになります。この後の時間にすべての点で

frames = [frames(2:end),frame]; 

、リストに保存し、あなたはあなたがしてアクセス10の以前のフレームから必要なプロパティを持っている:あなたの第二を与える

frames(2).prob2 

を8フレーム前のフレームのプロパティ。だから、あなたがすでに持っているものから少し変更されているだけですが、私があなたの質問を正しく理解すれば、問題を解決するはずです。