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