Niedriger FPS beim Zugriff auf den iPhone-Video-Ausgabebildpuffer

8

Ich versuche eine Bildbearbeitung auf dem iPhone durchzuführen. Ich verwende Ссылка , um die Kamerabilder aufzunehmen.

Mein Problem ist, dass wenn ich versuche, auf den aufgezeichneten Puffer zuzugreifen, der FPS der Kamera von 30 auf ungefähr 20 fällt. Weiß jemand, wie ich es beheben kann?

Ich verwende die niedrigste Aufnahmequalität, die ich finden konnte (AVCaptureSessionPresetLow = 192x144) im Format kCVPixelFormatType_32BGRA. Wenn jemand eine geringere Qualität kennt, die ich verwenden könnte, bin ich bereit, es zu versuchen.

Wenn ich den gleichen Bildzugriff auf anderen Plattformen, wie Symbian, mache, funktioniert es OK.

Hier ist mein Code:

%Vor%

Als Antwort auf die Antworten muss ich das Bild in Echtzeit verarbeiten, es wird angezeigt.

Ich habe bemerkt, dass wenn ich AVCaptureSessionPresetHigh verwende, das Einfachste, was ich mache, ist:

%Vor%

bewirkt, dass die Framerate auf 4-5 FPS fällt. Ich denke es ist, weil ein Bild in dieser Größe nicht zwischengespeichert wird.

Grundsätzlich brauche ich 96x48 Bild. Gibt es eine einfache Möglichkeit, das Kameraausgabebild zu verkleinern, eine Art, die Hardwarebeschleunigung verwendet, damit ich mit der kleinen arbeiten kann?

    
Asaf Pinhassi 23.11.2010, 11:26
quelle

3 Antworten

8

Alles, was über jedes Pixel in einem Bild iteriert, ist bei allen außer den schnellsten iOS-Geräten ziemlich langsam. Zum Beispiel habe ich das Iterieren über jedes Pixel in einem 640 x 480 Videorahmen (307.200 Pixel) mit einem einfachen Farbtest pro Pixel durchgeführt und festgestellt, dass dies nur bei etwa 4 FPS auf einem iPhone 4 funktioniert.

Sie betrachten die Verarbeitung von 27.648 Pixeln in Ihrem Fall, die schnell genug laufen sollte, um 30 FPS auf einem iPhone 4 zu erreichen, aber das ist ein viel schnellerer Prozessor als das, was im ursprünglichen iPhone und iPhone 3G war. Das iPhone 3G wird wahrscheinlich noch mit dieser Verarbeitungslast kämpfen. Sie sagen auch nicht, wie schnell der Prozessor in Ihren Symbian-Geräten war.

Ich würde vorschlagen, Ihren Verarbeitungsalgorithmus zu überarbeiten, um die Farbraumkonvertierung zu vermeiden. Es sollte nicht notwendig sein, die Farbkomponenten neu zu ordnen, um sie zu verarbeiten.

Zusätzlich könnten Sie selektiv einige Pixel verarbeiten, indem Sie in bestimmten Abständen innerhalb der Zeilen und Spalten des Bildes abtasten.

Wenn Sie schließlich auf die neueren iOS-Geräte abzielen, die OpenGL ES 2.0 (iPhone 3G S und neuer) unterstützen, können Sie mithilfe eines GLSL-Fragment-Shaders das Videoframe vollständig auf der GPU verarbeiten. Ich beschreibe den Prozess hier zusammen mit Beispielcode für Echtzeit-Farb-basierte Objektverfolgung. Die GPU kann diese Art der Verarbeitung in meinen Benchmarks 14 - 28 mal schneller als die CPU verarbeiten.

    
Brad Larson 23.11.2010, 19:53
quelle
1

Haftungsausschluss: DIESE ANTWORT IST EINE GUESS:)

Sie machen ziemlich viel Arbeit, während der Puffer gesperrt ist; hält das den Faden, der das Bild von der Kamera aufnimmt?

Sie könnten die Daten aus dem Puffer kopieren, während Sie daran arbeiten, so dass Sie sie so schnell wie möglich entsperren können, also etwa wie

%Vor%

Wenn es die Sperre ist, die die Aufnahme hält, dann sollte dies helfen.

NB Sie könnten dies beschleunigen, wenn Sie wissen, dass alle Puffer die gleiche Größe haben, können Sie einfach malloc einmal aufrufen, um den Speicher zu erhalten und ihn dann jedes Mal wiederverwenden und erst freigeben, wenn Sie alle Puffer verarbeitet haben.

Oder wenn das nicht das Problem ist, könntest du versuchen, die Priorität dieses Threads zu verringern

%Vor%     
deanWombourne 23.11.2010 13:29
quelle
0
___ answer4260244 ___

Alles, was über jedes Pixel in einem Bild iteriert, ist bei allen außer den schnellsten iOS-Geräten ziemlich langsam. Zum Beispiel habe ich das Iterieren über jedes Pixel in einem 640 x 480 Videorahmen (307.200 Pixel) mit einem einfachen Farbtest pro Pixel durchgeführt und festgestellt, dass dies nur bei etwa 4 FPS auf einem iPhone 4 funktioniert.

Sie betrachten die Verarbeitung von 27.648 Pixeln in Ihrem Fall, die schnell genug laufen sollte, um 30 FPS auf einem iPhone 4 zu erreichen, aber das ist ein viel schnellerer Prozessor als das, was im ursprünglichen iPhone und iPhone 3G war. Das iPhone 3G wird wahrscheinlich noch mit dieser Verarbeitungslast kämpfen. Sie sagen auch nicht, wie schnell der Prozessor in Ihren Symbian-Geräten war.

Ich würde vorschlagen, Ihren Verarbeitungsalgorithmus zu überarbeiten, um die Farbraumkonvertierung zu vermeiden. Es sollte nicht notwendig sein, die Farbkomponenten neu zu ordnen, um sie zu verarbeiten.

Zusätzlich könnten Sie selektiv einige Pixel verarbeiten, indem Sie in bestimmten Abständen innerhalb der Zeilen und Spalten des Bildes abtasten.

Wenn Sie schließlich auf die neueren iOS-Geräte abzielen, die OpenGL ES 2.0 (iPhone 3G S und neuer) unterstützen, können Sie mithilfe eines GLSL-Fragment-Shaders das Videoframe vollständig auf der GPU verarbeiten. Ich beschreibe den Prozess hier zusammen mit Beispielcode für Echtzeit-Farb-basierte Objektverfolgung. Die GPU kann diese Art der Verarbeitung in meinen Benchmarks 14 - 28 mal schneller als die CPU verarbeiten.

    
___ tag123iphone ___ Verwenden Sie diesen Tag NICHT, es sei denn, Sie wenden sich speziell an Apple's iPhone und / oder iPod touch. Verwenden Sie für nicht hardwareabhängige Fragen das Tag [ios]. Weitere zu betrachtende Tags sind [xcode] (aber nur, wenn es sich um die IDE selbst handelt), [swift], [objective-c] oder [cacao-touch] (aber nicht [cocoa]). Bitte verzichten Sie auf Fragen zum iTunes App Store oder zu iTunes Connect. Wenn Sie C # verwenden, markieren Sie mit [mono]. ___ tag123imageprocessing ___ Alles, was mit digitaler Bildverarbeitung zu tun hat, d. h. die Theorie und die Techniken, die verwendet werden, um Informationen aus digitalen Bildern zu extrahieren oder zu manipulieren. ___ qstntxt ___

Ich versuche eine Bildbearbeitung auf dem iPhone durchzuführen. Ich verwende Ссылка , um die Kamerabilder aufzunehmen.

Mein Problem ist, dass wenn ich versuche, auf den aufgezeichneten Puffer zuzugreifen, der FPS der Kamera von 30 auf ungefähr 20 fällt. Weiß jemand, wie ich es beheben kann?

Ich verwende die niedrigste Aufnahmequalität, die ich finden konnte (AVCaptureSessionPresetLow = 192x144) im Format kCVPixelFormatType_32BGRA. Wenn jemand eine geringere Qualität kennt, die ich verwenden könnte, bin ich bereit, es zu versuchen.

Wenn ich den gleichen Bildzugriff auf anderen Plattformen, wie Symbian, mache, funktioniert es OK.

Hier ist mein Code:

%Vor%

Als Antwort auf die Antworten muss ich das Bild in Echtzeit verarbeiten, es wird angezeigt.

Ich habe bemerkt, dass wenn ich AVCaptureSessionPresetHigh verwende, das Einfachste, was ich mache, ist:

%Vor%

bewirkt, dass die Framerate auf 4-5 FPS fällt. Ich denke es ist, weil ein Bild in dieser Größe nicht zwischengespeichert wird.

Grundsätzlich brauche ich 96x48 Bild. Gibt es eine einfache Möglichkeit, das Kameraausgabebild zu verkleinern, eine Art, die Hardwarebeschleunigung verwendet, damit ich mit der kleinen arbeiten kann?

    
___ answer4256493 ___

Haftungsausschluss: DIESE ANTWORT IST EINE GUESS:)

Sie machen ziemlich viel Arbeit, während der Puffer gesperrt ist; hält das den Faden, der das Bild von der Kamera aufnimmt?

Sie könnten die Daten aus dem Puffer kopieren, während Sie daran arbeiten, so dass Sie sie so schnell wie möglich entsperren können, also etwa wie

%Vor%

Wenn es die Sperre ist, die die Aufnahme hält, dann sollte dies helfen.

NB Sie könnten dies beschleunigen, wenn Sie wissen, dass alle Puffer die gleiche Größe haben, können Sie einfach malloc einmal aufrufen, um den Speicher zu erhalten und ihn dann jedes Mal wiederverwenden und erst freigeben, wenn Sie alle Puffer verarbeitet haben.

Oder wenn das nicht das Problem ist, könntest du versuchen, die Priorität dieses Threads zu verringern

%Vor%     
___ qstnhdr ___ Niedriger FPS beim Zugriff auf den iPhone-Video-Ausgabebildpuffer ___ tag123avfoundation ___ Das AVFoundation-Framework bietet Objective-C- und Swift-Schnittstellen zum Bearbeiten und Abspielen von audiovisuellen Medien in einer Mac OSX- oder iOS-Anwendung. Fragen, die dieses Framework verwenden, sollten dieses Tag enthalten. ___ tag123Videoprocessing ___ Die Videoverarbeitung befasst sich hauptsächlich mit dem Filtern von Videoframes. Die gebräuchlichsten Filter sind Rauschentfernung, Kontrast und Farbmodifikationen. Bei Fragen zum Zuschneiden und Ändern von Videos verwenden Sie [Videobearbeitung] und [Videokodierung] für Fragen zum Bearbeiten von Videos in einem beliebigen Format. ___ antwort4387369 ___

Kopieren Sie den Inhalt des Kamerarahmens in einen dedizierten Puffer und arbeiten Sie von dort aus weiter. Dies führt zu einer massiven Geschwindigkeitsverbesserung meiner Erfahrung. Meine beste Vermutung ist, dass der Speicherbereich, in dem sich der Kamerarahmen befindet, über spezielle Schutzmechanismen verfügt, die Lese- / Schreibzugriffe verlangsamen.

Überprüfen Sie die Speicheradresse der Kamerarahmendaten. Auf meinem Gerät ist der Kamera-Puffer bei 0x63ac000 . Das bedeutet nichts für mich, außer dass die anderen Heap-Objekte in Adressen sind, die näher an 0x1300000 sind. Der Lock-Vorschlag hat meine Verlangsamung nicht gelöst, aber die memcpy hat es geschafft.

    
___
gonzojive 08.12.2010 12:22
quelle