2

私はopencvを初めて使用します。私はそれを私のiosプロジェクトに統合しています。私のプロジェクトでは、UIImageからIplImageに、またはその逆に変換しています。また、openCVライブラリを使用してさまざまな画像フィルターを適用しています。

アプリのリークをテストしています。メモリモニターを使用して実行していますが、opencvの関数セットを実行するたびに、アプリが約1メガバイトずつ大きくなることに気付きました。新しいiplimageを割り当てるたびに、後で次のように呼び出してリリースします。

cvReleaseImage(&iplimage);

シミュレーターを使用して、メモリ不足の警告を強制し、イメージメモリを解放しています。アプリのメモリサイズには影響しないようです。

cvReleaseImageが実際にメモリを解放するのはいつですか?私は漏れていますか?

ARCをオンにしてiOS5.1を使用しています。

編集:

これは、UIImageをiplImageに変換するために使用しているコードです(私が見つけたコピーペースト)

- (UIImage *)UIImageFromIplImage:(IplImage *)image {
    NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    CGImageRef imageRef = CGImageCreate(image->width, image->height,
                                        image->depth, image->depth * image->nChannels, image->widthStep,
                                        colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast ,
                                        provider, NULL, false, kCGRenderingIntentDefault);
    UIImage *ret = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);
    return ret;
}
4

1 に答える 1

1

cvReleaseImage は、呼び出された瞬間に確実にメモリを解放しています。イメージの 2 つの部分のデロケーターを呼び出します。

  • データ
  • 画像ヘッダー

アプリでメモリ リークが報告された場合は、コード全体を確認する必要があります。おそらく、2 つのイメージを作成し、1 つをリリースするなどです。

于 2012-07-17T05:48:08.937 に答える