2017-12-06 1 views
1

저는 OpenCV를 RaspberryPi에서 실행 중이며 OpenCVs C 인터페이스를 사용하고 있습니다.OpenCV가 메모리를 누설합니다 (cvResize, cvCreateImage)

웹캠에서 이미지의 크기를 조정해야하므로 cvResize() 기능을 사용했습니다.

잘 작동하지만 몇 초 후에 메모리가 부족합니다. 코드를 while(1) 안에 실행하고 있기 때문에이 문제가있는 다른 사람들에 대해 읽었을 때 메모리 누출이 의심됩니다.

IplImage *frame; 
IplImage *frameRaw; 

main() { 
    CvCapture *capture = cvCreateCameraCapture(-1); 

    while (1) { 
     frameRaw = cvQueryFrame(capture); 
     frame = cvCreateImage(cvSize(WIDTH, HEIGHT), frameRaw->depth, frameRaw->nChannels); 

     cvResize(frameRaw, frame, 0); // 0 = CV_INTER_NEAREST 

     // Do something with "frame" 
    } 

} 

가 이미 cvReleaseImage(&frameRaw) (또는 &frame)를 사용하여 각 반복의 끝에서 예약 된 메모리를 해제하려고하지만 항상 분할 오류가 발생했습니다 :

여기 내 코드입니다. cvReleaseImageHeader()을 사용하면 세그먼트 화 오류가 발생하지 않았으며 메모리를 해제하지도 않았습니다.

또한 프레임의 캡쳐 해상도를 cvSetCaptureProperty()을 통해 변경하려고했지만 아무 것도하지 않았습니다.

누군가가 나를 어떻게 이해할 수 있습니까? 미리

감사 I는 솔루션을 발견 @ DanMašek에

+1

당신은 추가 라이브러리를 사용하고 있습니까? 어디서나 cvFreeImage 또는 cvFreeImageHeader를 찾을 수 없습니다. cvReleaseImage()를 의미합니까? –

+0

당신이 보여주는 코드는 확실히'cvReleaseImage' 호출이 빠졌습니다.'cvCreateImage'와 함께 - 당신은 언제나 할당하지 않습니다. 할당하지 마십시오. 또한,'frameRaw'의 할당을 해제해서는 안되며,'cvQueryFrame'의 문서에서 명시 적으로 언급하고 있습니다. –

+0

@bennji_of_the_overflow 네 말이 맞아, 나는'cvReleaseImage()'가 너무 늦은 것 같아서 ... – Panni

답변

1

감사 : 프레임에 대한 할당 된 메모리를 해제하는 각 반복 후에 while -loop

. 이는 cvReleaseImage(&frame)을 사용하여 수행 할 수 있습니다.

전체 코드는 이제 다음과 같습니다

IplImage *frame; 
IplImage *frameRaw; 

main() { 
    CvCapture *capture = cvCreateCameraCapture(-1); 

    while (1) { 
     frameRaw = cvQueryFrame(capture); 
     frame = cvCreateImage(cvSize(WIDTH, HEIGHT), frameRaw->depth, frameRaw->nChannels); 

     cvResize(frameRaw, frame, 0); // 0 = CV_INTER_NEAREST 

     // Do something with "frame" 

     cvReleaseImage(&frame); 
    } 

} 
관련 문제