2017-12-06 19 views
1

私はOpenCVをRaspberryPi上で実行しており、OpenCVs Cインターフェイスを使用しています。OpenCVリークメモリ(cvResize、cvCreateImage)

ウェブカメラから画像のサイズを変更する必要があるため、cvResize()機能を使用しました。

これはうまくいきますが、この問題を抱えている他の人については、while(1) -Loopのコードを実行しているので、数秒後にメモリが不足してしまいます。ここで

が私のコードです:

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()でフレームのキャプチャ解像度を変更しようとしましたが、何もしませんでした。

ここで間違っていることを誰かに教えてもらえますか?事前に

おかげで、私は解決策を見つけた@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); 
    } 

} 
関連する問題