2011-08-02 4 views
3

現在、画像から特徴点を抽出するためにSIFTを実装していますが、ディスクリプタを取得したときにメモリリークが発生していることがわかりました。とにかく、クラスに添付されているかもしれない記憶を解放することができますか?コードブロックSiftDescriptorExtractorによってメモリリークが発生する

cv::SiftFeatureDetector* features = new cv::SiftFeatureDetector(); 
cv::SiftDescriptorExtractor* extractor = new cv::SiftDescriptorExtractor(); 

std::vector<cv::KeyPoint> KeyPoints; 
cv::Mat Descriptors; 

// Turn the image into a Mat 
cv::Mat mImage = cv::Mat(iplImage); 

printf("Searching for keypoints in: %s.\n", szName.c_str()); 

// Detect keypoints 
features->detect(mImage, KeyPoints); 

printf("Found %d keypoints.\n", KeyPoints.size()); 

// Extract descriptors 
extractor->compute(mImage, KeyPoints, Descriptors); 

printf("Found %d descriptors.\n\n", Descriptors.rows); 

// Let my memory go! 
delete extractor; 
delete features; 

任意のアドバイスに

EDIT 追加された詳細を大幅に高く評価されています。ありがとう。

+0

これらの変数はすべて何ですか?私たちがあなたを助けるためにそれらを宣言してください。 – karlphillip

+0

申し訳ありませんが、コードをさらに説明するために投稿を編集しました。 – Seb

+0

このコードでメモリリークがあるとの結論はどうでしたか?私はあなたがそれをどのように測定したか知っています。 – karlphillip

答えて

1

あなたは正しくです。私はちょうどOpenCV 2.3とLinuxでテストしたとcompute()実際にメモリリークがあります。これはSurfDescriptorExtractorOrbDescriptorExtractorBriefDescriptorExtractorのように、あまりにもSiftDescriptorExtractor、そしておそらく他のタイプに影響を与えます。

ところで、このコードの最後にiplImageと呼ぶ画像をcvReleaseImage()に忘れないようにしてください。

+0

私のOpenCVバージョンを含めないと申し訳ありませんが、あなたは正しいです、それは2.3です。私は犯人を追跡し、CVソースファイルを修正して、そこから新しいlibとdllをビルドする必要があるように見えます。私の問題を確認していただきありがとうございます。 – Seb

0

2.3で作業しても、SiftDescriptorExtractorでメモリリークが発生することがあります。 しかし、他のディスクリプタエクストラクタにはこの問題はありません。 開発者に知らせるためにbugtrackerにチケットを作成することをお勧めします。

関連する問題