2012-02-20 329 views
-4

我在做this example。我遇到的問題是應用程序的內存消耗,它在180秒內開始大約在30秒內達到1.5 GB。釋放OpenCV :: VideoCapture的內存(或正確使用cvRelease)

void VideoCaptureCV::update() 
{ 
    cap >> frame; // cap is cv::VideoCapture 

    if(_img == 0) 
    { 
     _img = new CvMat(frame); 
    } 

    CvArr *arr = _img; 
    CvMat *arrMat, *cvimage, stub; 
    arrMat = cvGetMat(arr, &stub); 
    cvimage = cvCreateMat(arrMat->rows, arrMat->cols, CV_8UC3); 
    cvConvertImage(arrMat, cvimage, 0); 

    glEnable(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, tex_uid); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, cvimage->cols, cvimage->rows,0, GL_BGR, GL_UNSIGNED_BYTE, cvimage->data.ptr); 
    glBindTexture(GL_TEXTURE_2D, 0); 

    glDisable(GL_TEXTURE_2D); 

    w = cvimage->cols; 
    h = cvimage->rows; 

    // non of the following works correctly, it sends 
    // exception: cv::Exception at memory location 
    //cvRelease(&arr); 
    //cvReleaseMat(&arrMat); 
    //cvReleaseMat(&cvimage); 
    //cvReleaseMat(&stub); 
} 

關於如何正確使用cvRelease的任何想法?

編輯1:使用cvRelease

+0

「以下工作正確的是非,把它發送「...什麼? – genpfault 2012-02-20 21:20:39

+0

如果arr是使用new分配的,你真的可以調用cvRelease(&arr)嗎?你不應該調用delete _arr(或_img)嗎? – 2012-02-20 21:36:33

+0

試過刪除arr;同樣的問題,例外:cv ::內存位置的異常 – JohnnyAce 2012-02-20 22:36:32

回答

1
if(_img == 0) 
    { 
     _img = new CvMat(frame); 
    } 

    CvArr *arr = _img; 

時增加了錯誤發送這怎麼連編譯?

你並不需要調用new與OpenCV的圖像,他們將處理memory management爲你,只在本地創建的圖像堆棧上,讓OpenCV的清理

+0

你說得對,沒有理由打電話給新的:) – JohnnyAce 2012-02-20 23:16:01