2012-08-08 153 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