2

フレームサイズが何らかの方法で操作された場合、オプティカルフローに問題があります。これによりエラーが発生します。最初にビデオの解像度を変更する方法と、オプティカルフローが機能するようにフレームサイズを変更する方法の2つのオプションがあります。私はカスケードオブジェクトを追加して、鼻、口、および目をさらに進化させたいと考えています。したがって、これらの領域に対してオプティカルフローを個別に設定することなく、個々の領域で機能するソリューションが必要です。フレームごとにわずかに移動します。ここまでは私のコードですが、エラーは行列の大きさを超えているということです。オプティカルフロー用フレームのサイズ変更

faceDetector = vision.CascadeObjectDetector(); 

vidObj = vision.VideoFileReader('MEXTest.mp4','ImageColorSpace','Intensity','VideoOutputDataType','uint8'); 
converter = vision.ImageDataTypeConverter; 
opticalFlow = vision.OpticalFlow('ReferenceFrameDelay', 1); 
opticalFlow.OutputValue = 'Horizontal and vertical components in complex form'; 
shapeInserter = vision.ShapeInserter('Shape','Lines','BorderColor','Custom','CustomBorderColor', 255); 
vidPlayer = vision.VideoPlayer('Name','Motion Vector'); 

while ~isDone(vidObj); 
    frame = step(vidObj); 
    fraRes = imresize(frame,0.5); 
    fbbox = step(faceDetector,fraRes); 

    I = imcrop(fraRes,fbbox); 

    im = step(converter,I); 
    of = step(opticalFlow,im); 
    lines = videooptflowlines(of, 20); 
    if ~isempty(lines) 
     out = step(shapeInserter,im,lines); 
     step(vidPlayer,out); 
    end 
end 
release(vidPlayer); 
release(VidObj); 
+1

'vision.opticalFlow'システムオブジェクトは、将来のリリースで削除されます。 http://se.mathworks.com/help/vision/ref/opticalflow-class.html代替案は、私にもっとアピールします。つまり、間引かれた 'fraRes'からのフローを計算し、フロー(' of')をトリミングする必要があります。しかし、エラーの正確な行を指摘したいかもしれません。私はちょうど推測している。 – mainactual

+0

代替案は、実装された方法と同じ方法で動作します。実装する方法についてのみ説明します。顔をトリミングしてオプティカルフローを適用できるようになると、それらを試してみましょう。私はそれを行うことができますが、オプティカルフローは小さな画像でより速く計算され、顔領域にしか興味がないフルビデオではなく、より正確になると思います。 – UZIERSKI

答えて

1

UPDATE:私は行って、編集された行を作成し、オプティカルフローのための機能をし、これはいくつかのサイズの問題をソートすることは、各オブジェクトに対して手動で入力するこのする必要があるが(そのため、他の方法のLETがある場合私は知っている)。私は最高のソリューションは、cascadeObjectDetectorに固定サイズに設定されると思います、誰もこれを行う方法を知っていますか?それとも他のアイディアがありますか?

faceDetector = vision.CascadeObjectDetector(); %I need fixed size for this 
faceDetector.MinSize = [150 150]; 

vidRead = vision.VideoFileReader('MEXTest.mp4','ImageColorSpace','Intensity','VideoOutputDataType','uint8'); 
convert = vision.ImageDataTypeConverter; 
optFlo = vision.OpticalFlow('ReferenceFrameDelay', 1); 
optFlo.OutputValue = 'Horizontal and vertical components in complex form'; 
shapeInserter = vision.ShapeInserter('Shape','Lines','BorderColor','Custom', 'CustomBorderColor', 255); 

while ~isDone(vidRead) 
    frame = step(vidRead); 
    fraRes = imresize(frame,0.3); 
    fraSin = im2single(fraRes); 

    bbox = step(faceDetector,fraSin); 

    I = imcrop(fraSin, bbox); 

    im = step(convert, I); 
    release(optFlo); 
    of = step(optFlo, im); 
    lines = optfloo(of, 50); %use videooptflowlines instead of (optfloo) 
    out = step(shapeInserter, im, lines); 
    imshow(out); 
end 
+0

ビデオフレームの特性は何ですか?なぜそれらのサイズを変更する必要がありますか? – 16per9

+0

ビデオファイルが1080x1920であり、より正確であるため、顔検出器がより小さいフレームサイズでよりうまく機能するため、それらは大きすぎます。私は 'vision.VideoFileWriter'でビデオサイズのいくつかのプロパティを変更することは可能だと思いますが、それをどれだけ適切なサイズに圧縮するのか分かりません。 – UZIERSKI

+0

私は 'scaleFactor'を使ってより安定させましたが、フレームが常にサイズ変更され動いているようです。おそらく、左上のピクセルが最初のフレームで認識され、他のフレームに適用されて、完璧な結果が得られるように安定化されているかどうかはわかりません。 – UZIERSKI

関連する問題