我在释放存储在 STL 容器中的 opencv 图像时遇到问题。我正在开发一个系统来保存相机的最后几帧。我需要一个容器来存储图像。但是当我尝试使用迭代器访问图像并释放它们时,事情就出错了。 像这样。
deque<IplImage> ImageQue;
IplImage * temp=cvCreateImage(cvSize(30, 30), 8, 3);
ImageQue.push_back(*temp);
deque<IplImage>::iterator it=ImageQue.begin();
//temp and temp2 pointing different mem
IplImage * temp2=&*it;
//this goes wrong. execption at memory location.
cvReleaseImage(&temp2);
如果我尝试这个。
IplImage * try1=cvCreateImage(cvSize(30, 30), 8, 3);
//try1 and try2 are pointing the same mem.
IplImage * try2=&*try1;
//things alright here.
cvReleaseImage(&try2);
我觉得问题就出在这里。 双端队列::迭代器 it=ImageQue.begin(); IplImage * temp2=&*it;
知道这个吗?或者建议我是否想在 STL 容器中发布图像?
最佳答案
看起来您正在混合和匹配您的指针间接寻址。最好不要这样做:
deque<IplImage> ImageQue;
IplImage * temp=cvCreateImage(cvSize(30, 30), 8, 3);
ImageQue.push_back(*temp);
您可能应该使用指针容器(而不是使用首字母大写作为实例名称):
deque<IplImage*> imageQueue;
imageQueue.push_backcvCreateImage(cvSize(30, 30), 8, 3));
// ...
auto itr = imageQueue.begin();
IplImage* temp = *itr;
cvReleaseImage(&temp);
诸如此类。更重要的是,也许……如果您要像那样销毁图像,您可能应该先将它们从容器中取出,因为您可能不希望出现悬空指针队列。
IplImage* temp = imageQueue.front();
imageQueue.pop_front();
cvReleaseImage(&temp);
您还可以考虑使用某种智能指针(它会在其生命周期结束时自动释放 IplImage)...最新版本的 OpenCV 是否包含用于此类事情的不错的 C++ api,或者我是错误?如果有合适的自定义删除器,std::shared_ptr
也可能有效。
关于c++ - 在 STL 容器中发布 opencv 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11010349/