2013-04-15 36 views
8

Tôi đang sử dụng OpenCV on iOS để thực hiện một số xử lý hình ảnh trên UIImage.Giảm bộ nhớ được tiêu thụ theo phương pháp sử dụng OpenCv trên iOS

Phương pháp processImage đang tiêu thụ quá nhiều bộ nhớ. Khi tôi hồ sơ ứng dụng với phân bổ trong dụng cụ. Đỉnh số Live Bytes tại 65MB tới 70MB trong khoảng một giây. Điều này khiến ứng dụng gặp sự cố.

Được sử dụng để cao hơn tức là ~90MB, thay đổi int ddepth giảm số này (từ CV_16S đến CV_8U). Trong khi tôi hiểu rằng việc giảm độ sâu mong muốn của hình ảnh đích có thể làm giảm bộ nhớ được tiêu thụ, tôi không hiểu đó là hoạt động bên trong để chọn định dạng tốt nhất.

Việc giảm số ddepth cũng có vẻ như tăng thời gian thực hiện của phương thức.

Tôi muốn giảm đáng kể mức cao nhất của Live Bytes và giảm thời gian thực hiện của phương pháp.

Bất kỳ thông tin chi tiết nào về cách đạt được điều này sẽ được đánh giá cao.

- (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; 

} 

Chỉnh sửa Lưu ý: Tôi đang sử dụng cvMatFromUIImage từ docs.opencv.org

Sửa Cập nhật: Tôi chấp nhận @sansuiso 's câu trả lời vì nó làm giảm Live Bytes bởi ~3MB. Tuy nhiên, tôi vẫn đang tìm kiếm thêm giảm, bất kỳ đề xuất sẽ được đánh giá rất nhiều. Cảm ơn.

+0

Bạn có thể đưa định nghĩa về phương thức 'cvMatFromUIImage:' của mình không? –

+0

@BenLings [Ở đây] (http://docs.opencv.org/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation) nó là từ docs.opencv.org. –

Trả lời

3

Chức năng cv::GaussianBlur có thể xử lý hình ảnh tại chỗ. Bạn có thể gán đầu ra của [self cvMatFromUIImage:imageToProcess] để biến imageMatrix của bạn, mà sẽ tránh được một sự sáng tạo hình ảnh phụ và làm giảm giá trị đỉnh, tức là, tiến hành:

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

Bạn cũng có thể muốn kiểm tra các nội dung của phương pháp cvMatFromUIImage để đảm bảo mọi thứ được phát hành chính xác bên trong.

+0

Cảm ơn @sansuiso, tôi xin lỗi tôi không tuân theo chính xác những gì bạn có ý nghĩa về 'Bạn có thể gán đầu ra của [self cvMatFromUIImage: imageToProcess]'. –

+0

tức là 'cv :: Mat imageMatrix = [self cvMatFromUIImage: imageToProcess];' rồi 'cv :: GaussianBlur (imageMatrix, imageMatrix, cv :: Kích thước (3,3), sigmaX);'? –

+0

Vâng, chính xác. Tôi đang cập nhật câu trả lời. – sansuiso

2

Sự cố rò rỉ bộ nhớ trong số [self cvMatFromUIImage:] hoặc thường là vấn đề phân bổ bộ nhớ.

Để đảm bảo không có rò rỉ bộ nhớ, vui lòng hiển thị cho chúng tôi cvMatFromUIImage danh sách.

cấp phát bộ nhớ

Hãy thử di chuyển tất cả hình ảnh tạm thời của bạn cho các thành viên lớp. Điều này loại bỏ phân bổ bộ nhớ không cần thiết và mã của bạn sẽ được tái sử dụng bộ nhớ phân bổ trên mỗi khung hình. Không có trình quản lý bộ nhớ nào thích khi mã người dùng phân bổ bộ nhớ liên tục với một lượng lớn bộ nhớ và giải phóng nó. Bạn nên cố gắng tránh nó vì nó gây ra đột biến trong bộ nhớ tiêu thụ và bị treo vì trình quản lý bộ nhớ có thể giữ bộ nhớ trống trong một thời gian (sau khi bạn deallocate cv :: Mat).

+0

[Ở đây] (http://docs.opencv.org/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation) nó là từ docs.opencv.org. –

Các vấn đề liên quan