2012-08-08 103 views
0

该代码用于运动跟踪。它跟踪2张图片的不同点。但是,每次调用函数时,内存大小都会增加很多。 我知道它可能与cvPoints有关。什么是解决问题的好方法?谢谢内存泄漏在哪里

float calcorient(IplImage *imgA, IplImage *imgB) { 
    // Initialize, load two images from the file system, and 
    // allocate the images and other structures we will need for 
    // results. 
    // 
    const int MAX_CORNERS = 500; 
    CvSize img_sz = cvGetSize(imgA); 
    int  win_size = 10; 
    IplImage* imgC = cvCreateImage(img_sz, IPL_DEPTH_32F, 3); 
    // The first thing we need to do is get the features 
    // we want to track. 
    // 
    IplImage* eig_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1); 
    IplImage* tmp_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1); 
    int   corner_count = MAX_CORNERS; 
    CvPoint2D32f* cornersA  = new CvPoint2D32f[ MAX_CORNERS ]; 
    cvGoodFeaturesToTrack(
     imgA, 
     eig_image, 
     tmp_image, 
     cornersA, 
     &corner_count, 
     0.01, 
     5.0, 
     0, 
     3, 
     0, 
     0.04 
     ); 
    cvFindCornerSubPix(
     imgA, 
     cornersA, 
     corner_count, 
     cvSize(win_size,win_size), 
     cvSize(-1,-1), 
     cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03) 
     ); 
    // Call the Lucas Kanade algorithm 
    // 
    char features_found[ MAX_CORNERS ]; 
    float feature_errors[ MAX_CORNERS ]; 
    CvSize pyr_sz = cvSize(imgA->width+8, imgB->height/3); 
    IplImage* pyrA = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1); 
    IplImage* pyrB = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1); 
    CvPoint2D32f* cornersB  = new CvPoint2D32f[ MAX_CORNERS ]; 
    cvCalcOpticalFlowPyrLK(
     imgA, 
     imgB, 
     pyrA, 
     pyrB, 
     cornersA, 
     cornersB, 
     corner_count, 
     cvSize(win_size,win_size), 
     5, 
     features_found, 
     feature_errors, 
     cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3), 
     0 
     ); 
    // Now make some image of what we are looking at: 
    // 
    float sum=0; 

    for(int i=0; i<corner_count; i++) { 
     if(features_found[i]==0|| feature_errors[i]>550) { 
      //printf("Error is %f\n",feature_errors[i]); 
      continue; 
     } 
     //printf("Got it\n"); 
     sum+=cornersA[i].x-cornersB[i].x; 
     //printf("%f\n",sum); 
     CvPoint p0 = cvPoint(
      cvRound(cornersA[i].x), 
      cvRound(cornersA[i].y) 
      ); 
     CvPoint p1 = cvPoint(
      cvRound(cornersB[i].x), 
      cvRound(cornersB[i].y) 
      ); 
     cvLine(imgC, p0, p1, CV_RGB(255,0,0),2); 
    } 
    //cvNamedWindow("ImageA",0); 
    //cvNamedWindow("ImageB",0); 
    //cvNamedWindow("LKpyr_OpticalFlow",0); 
    //cvShowImage("ImageA",imgA); 
    //cvShowImage("ImageB",imgB); 
    //cvShowImage("LKpyr_OpticalFlow",imgC); 
    //cvWaitKey(1); 
    return sum; 
} 
+2

你在那里有一堆'cvCreate'调用,但我没有看到任何看起来可以释放所有这些的东西。 – Mat 2012-08-08 18:21:57

+1

你已经尝试valgrind或类似?你期望这里的人是你的众包调试器吗? – 2012-08-08 18:22:59

+0

有2个“新”。 C++在返回后是否删除它们? – 2012-08-08 18:23:37

回答

4

看起来像你正在分配一堆内存,而不是删除它。

尝试添加行:

delete [] cornersA; 
delete [] cornersB; 

在你的函数结束。

您也可以查看cvCreate的电话 - 如果他们没有在其他地方被释放,可能会导致问题。

+0

我加了delete [] cornersA; 删除[]角B;但仍然有很大的内存泄漏。我会试着释放cvCreate并看看会发生什么。 – fmvpsenior 2012-08-08 18:32:44

+1

我发布了所有创建的图像,它工作。谢谢。 – fmvpsenior 2012-08-08 18:36:36

3

感谢CvReleaseImage你必须释放你的IplImages。

+0

是的,它做到了。 – fmvpsenior 2012-08-08 18:37:29