关于内存管理问题,
如果你想保留 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 之外进行图像处理。IplImage
void*
IplImage
使用 OpenCV,您不必IplImage
在每个处理步骤都创建一个新的。您可以对任何就地算法使用相同IplImage
的源和目标,并且您始终可以为任何其他算法重用相同的临时缓冲区。