关于内存管理问题,
如果你想保留 C 接口,你可以使用cv::Ptr<_Tp>类似于 c++11 的shared_ptr:
cv::Ptr<IplImage> image = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
image由于析构函数,一旦指针被销毁,您的图像就会自动释放Ptr<IplImage>:
template<> inline Ptr<IplImage>::delete_obj() {
cvReleaseImage(&obj);
}
请注意,您可以使用具有内置内存管理的 OpenCV 的 C++ 接口(cv::Mat而不是作为实例):cv::IplImage
cv::Mat image(Size(640, 480), CV_8UC1);
关于内存使用优化,
您可以使用cvCreateImageHeader,cvSetData并按照建议从缓冲区cvReleaseImageHeader中创建一个而不重新分配整体,但我真的不明白这一点,除非您在 OpenCV 之外进行图像处理。IplImagevoid*IplImage
使用 OpenCV,您不必IplImage在每个处理步骤都创建一个新的。您可以对任何就地算法使用相同IplImage的源和目标,并且您始终可以为任何其他算法重用相同的临时缓冲区。