cvCreateImage内存泄露

这些天在弄OpenCV,用来把两张640*480的图片拼在一起,拼成1280*480,然后发现调用下面这个函数的时候内存一直在增大,貌似有些变量无法释放内存.

void Show2Image(cv::Mat cvImg1, cv::Mat cvImg2)
{
    beginTime =clock();
    std::cout<<“图片合并开始时间:”<<beginTime<<std::endl;
    IplImage* image1=&cvImg1.operator IplImage();
    IplImage* image2=&cvImg2.operator IplImage();
    IplImage* image3 = cvCreateImage( cvSize(image1->width+image2->width,MAX(image1->height,image2->height)),IPL_DEPTH_8U,3);

    CvRect rect=cvRect(0,0,image1->width,image1->height);
    cvSetImageROI(image3,rect);
    cvCopy(image1,image3);
    cvResetImageROI(image3);
    rect=cvRect(image1->width,0,image2->width,image2->height);
    cvSetImageROI(image3,rect);

    cvCopy(image2,image3);
    cvResetImageROI(image3);

    cvShowImage(“Kinect Follow & Xtion ObstacleAvoide”,image3);

    //cvReleaseImage(&image3);
    endTime =clock();
    std::cout<<“结束时间:”<<endTime<<std::endl
             <<“图片合并花费时间:”<<endTime-beginTime<<std::endl<<std::endl;
}

经过排查,发现是

   IplImage* image3 = cvCreateImage( cvSize(image1->width+image2->width,MAX(image1->height,image2->height)),IPL_DEPTH_8U,3);

这句代码导致内存增大.

然后发现cvCreateImage需要和cvReleaseImage配合用,譬如上述代码,需要用cvReleaseImage(&image3);来释放image3的内存,而image1和image2不是用cvCreateImage创建的,所以不用使用cvReleaseImage来释放,假如你使用了,反而会报错.

 

解决方案[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]

解决方案:

在VS2010经历一些更新,或者是在装完VS2010后再安装了更高级的版本,例如VS2012,VS2013等,会出现

LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

的错误!

解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可,但是没新建一个项目都要这样设置一次。
在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:
第一步:与上相同。
第二步:将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”。
第三步:一般计算机经过上两步设置就能解决问题了,但是如果还有问题,那就按一下方法解决:

找到Microsoft Visual Studio 10.0\VC\bin ,把cvtres.exe删除,然后找到新版本的VC\bin里面的cvtres.exe拷贝过来.

例如,我的VS2010 bin路径是在 C:\Program Files\Microsoft Visual Studio 10.0\VC\bin

VS2012 bin路径是在D:\Program Files\Microsoft Visual Studio 12.0\VC\bin

把10.0\bin里面的cvtres.exe删除,把12.0\bin里面的cvtres.exe复制到10.0\bin里面

然后运行程序就没问题了!

意外的是,治本的办法是第三步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。