2010-07-21 28 views
2

我在下面的代码泄漏。当我使用cvCreateImage而不是cvCreateImageHeader时,它是304Kb和107b泄漏,但是当我改变它时,它变成只有107个叮咬。 你能帮我找到泄漏吗?在OpenCV NSImage泄漏到IplImage转换器程序

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

这个问题似乎搞砸了..你能格式化它好一点吗? – 2010-07-22 16:55:13

回答

0

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

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

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

希望这会有所帮助。