2012-03-14 179 views
4

这可能是一个愚蠢的问题,但是在iOS中编程时,ARC(自动引用计数)与Open CV进行交互?iOS中的Open-CV内存管理(Objective-c与ARC)

我在问这个,因为我最近刚开始使用Open CV。在iOS上使用ARC时,不必担心对象,因为我只需确保没有指向它们的指针,以便它们可以被释放。

打开CV似乎有类似的清洁功能:

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

当使用新的界面,在需要的时候最内存释放,甚至 内存分配操作是自动完成的。

首先,这是否意味着我不必释放这些对象?

其次,我在同一个.mm文件中同时使用了OpenCV和Objective C.假设物体不会互相干扰是否安全?

例如,这会给我从简历垫一个的UIImage:

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

*方法罗宾夏丘采取

预先感谢任何咨询。

回答

4

首先,这是否意味着我不必释放这些对象?

是的,直到你创建它们使用新的运营商。看看这个代码:

{ 
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的,并在同一.mm文件目标C。假设物体不会互相干扰是否安全?

在你initWithCVMat functiton的图像数据被复制到用于初始化的的新实例的UIImage的NSData对象。

对你来说意味着:
1)的UIImage类的实例将负责发布的图像数据。如果你使用ARC--它会自动完成;否则你必须致电[UIImage发布]
2)不要担心cv :: Mat - 它会在销毁时自动释放内存。

+0

非常感谢你,我刚刚很困惑,因为我对opencv完全陌生,顺便说一句,你的网页有很好的工作方式,我很久以前就从它开始跳起来了。我打算使用脚本,但我认为它打破了iOS 5.1。 – Pochi 2012-03-21 09:02:25

+0

顺便说一句,我忘了提及,我想我找出了内存崩溃的原因。看来,因为我使用卢卡斯卡纳德pyr光流法。当我做出突然的动作时,金字塔部分正在移动太多的层次,因此使用了太多的内存。 MAYBE哈哈 – Pochi 2012-03-21 09:31:42