Управление памятью Open-CV в iOS (Objective-c с ARC) - PullRequest
4 голосов
/ 14 марта 2012

Это может быть глупый вопрос, но взаимодействует ли ARC (автоматический подсчет ссылок) с Open CV при программировании на iOS?

Я спрашиваю об этом, потому что я только недавно начал использовать Open CV в целом.В то время как на iOS с ARC не нужно беспокоиться об объектах, так как мне нужно только следить за тем, чтобы на них не было указателей, чтобы их можно было освободить.

У открытого CV, похоже, есть похожая функция очистки:

http://opencv.willowgarage.com/documentation/cpp/memory_management.html

При использовании нового интерфейса большинство операций по освобождению памяти и даже по выделению памятивыполняются автоматически при необходимости.

Во-первых, означает ли это, что мне не нужно освобождать эти объекты?

Во-вторых, я использую и OpenCV, и Objective C. в одном и том же.мм файл.Можно ли предположить, что объекты не будут связываться друг с другом?

Например, это даст мне UIImage от cv Mat:

+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat
{
    return [[UIImage alloc] initWithCVMat:cvMat];
}

Который использует это:

- (id)initWithCVMat:(const cv::Mat&)cvMat
{
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];

    CGColorSpaceRef colorSpace;

    if (cvMat.elemSize() == 1)
    {
        colorSpace = CGColorSpaceCreateDeviceGray();
    }
    else
    {
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                     // Width
                                        cvMat.rows,                                     // Height
                                        8,                                              // Bits per component
                                        8 * cvMat.elemSize(),                           // Bits per pixel
                                        cvMat.step[0],                                  // Bytes per row
                                        colorSpace,                                     // Colorspace
                                        kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                        provider,                                       // CGDataProviderRef
                                        NULL,                                           // Decode
                                        false,                                          // Should interpolate
                                        kCGRenderingIntentDefault);                     // Intent   

    self = [self initWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    return self;
}

* метод взят от Робина Саммерхилла

Заранее благодарен за любые советы.

1 Ответ

4 голосов
/ 21 марта 2012

Во-первых, означает ли это, что мне не нужно освобождать эти объекты?

Да, пока вы не создадите их, используя оператор new . Посмотрите на этот код:

{
cv::Mat image(640,480); // allocate image
//.. do something with it
self.myImage = [UIImage imageWithCVMat:image];
}
// Out of scope - image is deallocated automatically.
// But self.myImage is still accessible since it contains a copy of image.

Во-вторых, я использую и OpenCV, и Objective C в одном и том же файле .mm. Можно ли предположить, что объекты не будут мешать друг другу?

В функции initWithCVMat данные изображения копируются в NSData объект, который используется для инициализации нового экземпляра UIImage .

Для вас это значит:
1) Экземпляр класса UIImage будет отвечать за освобождение данных изображения. Если вы используете ARC - это будет сделано автоматически; в противном случае вы должны позвонить [UIImage release] .
2) Не беспокойтесь о cv :: Mat - он освободит память автоматически при уничтожении.

...