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来释放,假如你使用了,反而会报错.

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注