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

Posted Harley_Quinn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题相关的知识,希望对你有一定的参考价值。

最近准备重新学习图像处理的知识,主要目的是自己实现一遍图像处理的算法,所以除了读取、保存图像外的操作都自己写,没想到直接封装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读取保存功能遇到的小问题的主要内容,如果未能解决你的问题,请参考以下文章

vs2013下配置opencv1.0.0

openCV1.0 cvLoadImage显示图像

OpenCV中IplImage和Mat间的相互转换

OPENCV第一篇

HighGUI 图形用户界面

VS2003安装Opencv1.0 windows系统 win7