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