2013-04-15 10 views
8

Używam OpenCV on iOS do przetwarzania niektórych obrazów na UIImage.Zmniejszenie ilości pamięci zużywanej przez metodę używającą OpenCv na iOS

Metoda zużywa zbyt dużo pamięci. Kiedy profiluję aplikację z przydziałami w Instrumentach. Piki Live Bytes osiągają wartości od 65MB do 70MB przez około sekundę. Powoduje to awarię aplikacji.

Wcześniej był wyższy tj. ~90MB, zmieniając int ddepth zmniejszono to (z CV_16S do CV_8U). Chociaż rozumiem, że zmniejszenie "pożądanej głębokości docelowego obrazu" może zmniejszyć ilość zużywanej pamięci, nie rozumiem, że to wewnętrzne działanie, które wybiera najlepszy format .

Redukcja wartości ddepth wydaje się również wydłużać czas wykonania metody.

Chcę znacznie zmniejszyć szczyt Live Bytes i skrócić czas wykonania metody.

Wszelkie spostrzeżenia na temat tego, jak to osiągnąć, byłyby mile widziane.

- (void)processImage:(UIImage *)imageToProcess 
{ 
cv::Mat imageMatrix; 

double sigmaX = 1.0; 

int ddepth = CV_8U; // ddepth – The desired depth of the destination image 

cv::GaussianBlur([self cvMatFromUIImage:imageToProcess], imageMatrix, cv::Size(3,3), sigmaX); 

cv::Laplacian(imageMatrix, imageMatrix, ddepth, 1); 

double minVal; 
double maxVal; 

cv::minMaxLoc(imageMatrix, &minVal, &maxVal); 

std::cout << "min val : " << minVal << std::endl; 
std::cout << "max val: " << maxVal << std::endl; 

} 

Edit Uwaga: Używam cvMatFromUIImage z docs.opencv.org

Edycja Aktualizacja: Przyjąłem @sansuiso „s odpowiedź gdyż zmniejszyło Live Bytes przez ~3MB. Jednak nadal szukam dalszej redukcji, wszelkie sugestie będą bardzo mile widziane. Dzięki.

+0

Czy można dołączyć definicję metody 'cvMatFromUIImage:'? –

+0

@BenLings [tutaj] (http://docs.opencv.org/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation) pochodzi z docs.opencv.org. –

Odpowiedz

3

Funkcja cv::GaussianBlur może przetwarzać obraz w miejscu. można przypisać wyjście [self cvMatFromUIImage:imageToProcess] do zmiennej imageMatrix, co pozwoli uniknąć dodatkowego tworzenia obrazu i obniżyć wartość szczytową, czyli kontynuować:

cv::Mat imageMatrix = `[self cvMatFromUIImage:imageToProcess]; 
cv::GaussianBlur(imageMatrix, imageMatrix, cv::Size(3,3), sigmax); 

Można też sprawdzić zawartość metody cvMatFromUIImage aby upewnić się, że wszystko jest prawidłowo wydane wewnątrz.

+0

Dzięki @sansuiso, przepraszam, że nie śledzę dokładnie tego, co masz na myśli mówiąc o "Możesz przypisać wyjście [self cvMatFromUIImage: imageToProcess]". –

+0

tj. 'Cv :: Mat imageMatrix = [self cvMatFromUIImage: imageToProcess];' następnie 'cv :: GaussianBlur (imageMatrix, imageMatrix, cv :: Size (3,3), sigmaX);'? –

+0

Tak, dokładnie. Aktualizuję odpowiedź. – sansuiso

2

Jest to albo wyciek pamięci w [self cvMatFromUIImage:] lub problemu często przydziału pamięci.

Aby upewnić się, że nie ma wycieku pamięci, wyświetl nam numer cvMatFromUIImage.

alokacji pamięci

Spróbuj przenieść wszystkie swoje tymczasowe obrazy do członków klasy. Eliminuje to niepotrzebne przydzielanie pamięci, a Twój kod będzie ponownie wykorzystywał pamięć przydzieloną do każdej ramki. Żaden menedżer pamięci nie lubi, gdy kod użytkownika dokonuje stałych alokacji pamięci ogromnej ilości pamięci i uwalnia go. Powinieneś tego unikać, ponieważ powoduje to wzrost zużycia pamięci i awarii, ponieważ menedżer pamięci może przechowywać wolną pamięć przez jakiś czas (po zwolnieniu cv :: Mat).

+0

[tutaj] (http://docs.opencv.org/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation) pochodzi z docs.opencv.org. –

Powiązane problemy