OpenCV NSImage泄漏到IplImage转换器程序

时间:2010-07-21 12:01:27

标签: cocoa opencv memory-leaks

我在下面的代码中有泄漏。当我使用cvCreateImage而不是cvCreateImageHeader时,它是304Kb和107b泄漏,但是当我改变时它变成了107咬。 你能帮我找一下泄漏吗?

+ (IplImage *) nsImageToIplImage:(NSImage *)image {
    // NSImage to IplImage

    NSBitmapImageRep *orig = [[image representations] objectAtIndex: 0];
    // a copy or else the color-channel shift that we do later on will affect the original NSImage!

    NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[orig representationUsingType:NSTIFFFileType properties:NULL]];
    int depth       = [rep bitsPerSample];
    int channels    = [rep samplesPerPixel];
    int height      = [rep size].height;
    int width       = [rep size].width;

    // note- channels had better be "3", or else the loop down below will act pretty funky...
    // NSTIFFFileType seems to always give three-channel images, so I think it's okay...


    IplImage *to_return = cvCreateImageHeader(cvSize(width, height), depth, channels);
    cvSetImageData(to_return, [rep bitmapData], [rep bytesPerRow]);



    // Reorder BGR to RGB
    // no, I don't know why it's in BGR after cvSetData
    for (int i = 0; i < to_return->imageSize; i += 3) {
        uchar tempR, tempG, tempB;
        tempR = to_return->imageData[i];
        tempG = to_return->imageData[i+1];
        tempB = to_return->imageData[i+2];

        to_return->imageData[i] = tempR;
        to_return->imageData[i+1] =tempG;
        to_return->imageData[i+2] = tempB;

    }




    return to_return;
}

1 个答案:

答案 0 :(得分:0)

这是你对cvSetImageData的调用。当您调用cvCreateImage时,它会分配标头和图像数据。 cvCreateImageHeader只分配图像头。

当您调用cvSetImageData时,它不会将数据复制到结构中。相反,它只是将指针设置为指向您提供的任何数据。因此,如果您调用cvCreateImage然后调用cvSetImageData,则cvCreateImage分配的图像数据将丢失。

你这样做的一个相当讨厌的副作用是,用户可能会调用cvReleaseImage,这实际上会尝试释放[rep bitmapData]中的数据。更好的方法是简单地调用cvCreateImage,然后将[rep bitmapData]中的所有数据复制到其中。

希望这有帮助。