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」計算流量,然後裁剪流量('')。但是,也許你想指出錯誤的確切路線。我只是猜測。 – mainactual

+0

這些替代品的工作方式與實施方法相同,只是實施方法,我會嘗試那些能夠裁剪臉部並將光流應用到臉部的方法。我可以做到這一點,但是光流量會在較小的圖像上計算得更快,我認爲這會更精確,而不是在完整的視頻中進行,而我只對臉部區域感興趣。 – UZIERSKI

回答

1

UPDATE:我去和編輯爲它創建線光流的功能和該挑選出的一些尺寸的問題然而,有必要輸入該手動爲每個對象(因此,如果有任何其他方式讓我知道)。我認爲最好的解決方案將設置爲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