Reduzieren Sie den Speicherverbrauch einer Methode, die OpenCv unter iOS verwendet

8

Ich verwende OpenCV unter iOS , um einige Bildverarbeitungen in% co_de durchzuführen %.

Die Methode UIImage verbraucht zu viel Speicher. Wenn ich die App mit Zuweisungen in Instrumenten profiliere. Die processImage Spitzen bei Live Bytes bis 65MB für ungefähr eine Sekunde. Dies führt zum Absturz der Anwendung.

Früher war es höher, d. h. 70MB , änderte ~90MB reduzierte dies (von int ddepth auf CV_16S ). Während ich verstehe, dass die Reduzierung der 'gewünschten Tiefe des Zielbildes' die Speicherkapazität reduzieren kann, verstehe ich nicht, dass es die inneren Abläufe sind, um das Beste auszuwählen Format.

Die Reduktion in CV_8U scheint auch die Ausführungszeit der Methode zu erhöhen.

Ich möchte den ddepth Peak stark reduzieren und die Ausführungszeit der Methode ebenfalls reduzieren.

Alle Einsichten, wie dies zu erreichen ist, würden wir sehr begrüßen.

%Vor%

Bearbeiten Hinweis: Ich verwende cvMatFromUIImage von Live Bytes

Update bearbeiten: Ich habe die Antwort von @sansuiso akzeptiert, da sie docs.opencv.org by Live Bytes reduziert hat. Ich bin jedoch immer noch auf der Suche nach weiteren Reduktionen, alle Vorschläge werden sehr geschätzt. Danke.

    
Ríomhaire 15.04.2013, 13:18
quelle

2 Antworten

3

Die Funktion cv::GaussianBlur kann ein Bild direkt verarbeiten. Sie können die Ausgabe von [self cvMatFromUIImage:imageToProcess] Ihrer Variablen imageMatrix zuweisen, wodurch eine zusätzliche Bilderstellung vermieden und der Spitzenwert reduziert wird, d. H. Mit:

fortfahren %Vor%

Sie können auch den Inhalt der cvMatFromUIImage -Methode überprüfen, um sicherzustellen, dass alles korrekt innerhalb von freigegeben wird.

    
sansuiso 15.04.2013, 14:18
quelle
2

Es ist entweder Speicherleck im [self cvMatFromUIImage:] oder häufig Speicherzuweisung Problem .

Um sicher zu sein, dass kein Speicherleck vorhanden ist, zeigen Sie uns cvMatFromUIImage listing.

Speicherzuweisung

Versuchen Sie, alle temporären Bilder an die Teilnehmer zu übertragen. Dies eliminiert unnötige Speicherzuweisungen und Ihr Code wird zugewiesenen Speicher für jeden Rahmen wiederverwenden. Kein Speichermanager mag es, wenn der Benutzercode eine konstante Speicherzuweisung großer Speichermengen vornimmt und diese freigibt. Sie sollten versuchen, es zu vermeiden, da es zu Spikes im Speicherverbrauch und zu Abstürzen führt, da der Speichermanager einen freien Speicher für einige Zeit freihalten kann (nachdem Sie die Zuweisung von cv :: Mat aufgehoben haben).

    
BloodAxe 19.04.2013 08:08
quelle