2

Ich habe Probleme mit dem optischen Fluss, wenn die Rahmengröße in irgendeiner Weise manipuliert wurde, dies gibt mir einen Fehler. Es gibt zwei Möglichkeiten, entweder die Auflösung des Videos am Anfang zu ändern oder irgendwie die Rahmengröße so zu ändern, dass der optische Fluss funktioniert. Ich werde ein Kaskadenobjekt hinzufügen, um Nase, Mund und Augen in der weiteren Entwicklung zu erkennen, daher brauche ich eine Lösung, die für einzelne Regionen funktioniert, ohne den optischen Fluss für diese Bereiche individuell einzustellen, insbesondere, dass eine Bounding-Box keine feste Größe hat wird sich von Rahmen zu Rahmen leicht verschieben. Hier ist mein Code so weit, der Fehler ist, dass es Matrixdimensionen überschreitet.Größe ändern Rahmen für optischen Fluss

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

Das 'vision.opticalFlow' System-Objekt wird in einer zukünftigen Version entfernt. http://se.mathworks.com/help/vision/ref/opticalflow-class.html Die Alternativen sprechen mich mehr an. Das heißt, Sie sollten den Fluss von dezimierten 'fraRes' berechnen und dann den Fluss (' of') zuschneiden. Aber vielleicht möchten Sie auf die genaue Fehlerlinie hinweisen. Ich kann nur raten. – mainactual

+0

Die Alternativen funktionieren auf die gleiche Weise wie die implementierte, es ist nur eine Methode zu implementieren, und ich werde mit denen experimentieren, sobald ich in der Lage sein werde, das Gesicht zu beschneiden und den optischen Fluss darauf anzuwenden. Ich könnte das machen, aber der optische Fluss wird schneller auf einem kleineren Bild berechnet und ich denke, es wäre präziser, anstatt es auf einem vollen Video zu machen, wo ich nur an den Gesichtsregionen interessiert bin. – UZIERSKI

Antwort

1

UPDATE: Ich ging und die Funktion für den optischen Fluss bearbeitet, die es ist dies für jedes Objekt manuell einzugeben notwendig jedoch Linien und diese aussondert, die einige Größenprobleme schafft (also wenn es eine andere Möglichkeit ist lassen ich weiß). Ich denke, die beste Lösung wäre eine feste Größe für cascadeObjectDetector, weiß jemand, wie man das macht? Oder hast du eine andere Idee?

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

Welche Eigenschaften haben Ihre Videorahmen? Warum müssen Sie die Größe ändern? – 16per9

+0

sind sie einfach zu groß, da die Videodatei 1080x1920 ist und Gesichtsdetektor besser auf einer kleineren Größe des Rahmens arbeitet, da es genauer ist. Ich denke, dass es möglich ist, einige Eigenschaften der Videogröße mit 'vision.VideoFileWriter' zu ändern, aber ich weiß nicht, wie gut es auf die bevorzugte Größe komprimiert wird. – UZIERSKI

+0

Ich habe 'scaleFactor' verwendet, um es stabiler zu machen, aber es sieht so aus, als ob der Rahmen ständig skaliert und bewegt wird. Vielleicht, wenn das obere linke Pixel im ersten Frame erkannt und auf andere Frames angewendet wurde, um es für ein perfektes Ergebnis zu stabilisieren, aber nicht sicher. – UZIERSKI