码迷,mamicode.com
首页 > 其他好文 > 详细

手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题

时间:2016-03-31 23:07:15      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

最近准备重新学习图像处理的知识,主要目的是自己实现一遍图像处理的算法,所以除了读取、保存图像外的操作都自己写,没想到直接封装OpenCV的读取、保存功能的第一步就出错。关键代码如下

void MyImage::Clear()
{
    if (m_pImg != nullptr)
    {
        std::cout << "释放内存" << std::endl;
        delete m_pImg;
        m_pImg = nullptr;
    }
}

其中m_pImg是IplImage*类型,析构函数调用Clear函数。在主函数里用窗口显示图像,关闭后就成了这样子了

技术分享

打开图像时没问题,关闭显示窗口后就出现错误。

Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

是典型的内存泄露的表现。

原来是OpenCV中对于IplImage的内存释放是严格要用cvReleaseImage函数的,毕竟delete对应的是new,而IplImage*不是用new来申请内存,而是用cvCreateImage或cvLoadImage这种封装了申请内存的方法。所以不能习惯性地对指针用delete,把那段改成cvReleaseImage(&m_pImg);即可

手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题

标签:

原文地址:http://www.cnblogs.com/Harley-Quinn/p/5343141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!