gpt4 book ai didi

ios - OpenCV 代码导致 UIImages 泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 22:30:47 27 4
gpt4 key购买 nike

我正在使用 OpenCV 在 iOS 上进行实时视频处理,但没有使用 CvVideoCamera。由于内存压力,我的应用程序崩溃了。

原生 iOS 相机在每次捕获帧时调用此函数:

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
//convert the frame to a UIImage:
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];

//convert the UIImage to a Mat:
Mat srcMat = [self cvMatFromUIImage:image];

//Process the Mat:
Mat dst, cdst;
Canny(srcMat, dst, 50, 200, 3);
cvtColor(dst, cdst, COLOR_GRAY2BGR);
}

由于内存压力,该应用程序在大约 15 秒后崩溃。

我正在使用 Apple's code for imageFromSampleBuffer: , 和 OpenCV's code for cvMatFromUIImage .是的,我正在使用 ARC。

我使用 Allocations Instrument 对应用程序进行了概要分析,发现崩溃是由于大量 UIImage 被创建但从未被释放造成的。经过一些调查,我发现对 Canny() 的调用对此负责,因为 UIImage 对象在调用 Canny()< 时不会泄漏 被注释掉了。

为什么调用 Canny 会使 UIImage 对象保留在内存中?

最佳答案

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{

CFRetain(sampleBuffer);

dispatch_queue_t myQueue = dispatch_queue_create("my.dispatch.q", 0);
dispatch_async(myQueue,
^{
//convert the frame to a UIImage:
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];

//convert the UIImage to a Mat:
Mat srcMat = [self cvMatFromUIImage:image];

//Process the Mat:
Mat dst, cdst;
Canny(srcMat, dst, 50, 200, 3);
cvtColor(dst, cdst, COLOR_GRAY2BGR);
CFRelease(sampleBuffer);
});
}

关于ios - OpenCV 代码导致 UIImages 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25748372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com