c++ - 在 STL 容器中发布 opencv 图像?

标签 c++ opencv

我在释放存储在 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/

相关文章:

c++ - 我可以简单地将 dll 库放到 Windows 文件夹中吗?

java - 在 3D 结构中添加新顶点

c++ - 为什么我会得到这个奇怪的角色?

c++ - glsl - 光线行进在片段着色器中不起作用

opencv - 如何根据 hog 特征去除相似图像?

c++ - 用我的应用程序打包一个 jre

python - re.findall为负数,我的代码仅适用于正数

c++ - opencv cvblob渲染问题

python - 如何使用 OpenCV houghlines 计算屏幕截图中的选项卡数量?

openCV 3D 矩阵/直方图的高斯模糊/平滑