2016-09-29 14 views
0

私は、ポイント検出にはFASTを使用し、ディスクリプタを構築するにはSIFTを使用してディスクリプタを作成しようとしています。その目的のためにOpenCVを使用します。私はOpenCVのFASTを使用していますが、私はSIFTコードの一部を使用しています。なぜなら、私はDescriptorしか必要としないからです。今私は本当に厄介なmallocエラーがあり、私はそれを解決する方法を知らない。私はコードがGitHubに投稿されました。なぜなら、それは大きく、エラーがどこから来るのか本当に分かりません。私はちょうどそれは、DO-WHILEループの終わりに作成されていることを、知っている:Mallocエラー:push_back VectorのOpenCV/C++

features2d.push_back(features); 
    features.clear(); 
    candidates2d.push_back(candidates); 
    candidates.clear(); 
    } 
}while(candidates.size() > 100); 

あなたはGitHubでのコードの中で見ることができるように、私はすでにアプリケーションのメモリを解放しようとしました。 Xcode Analysisによると、私のアプリケーションは9Mbのメモリを使用しています。私はエラーをデバッグしようとしましたが、それは非常に複雑で、エラーがどこから来たのか分かりませんでした。

このエラーは、私のコードで57を、私はライン56でimg.at<sift_wt>(...)typdef float sift_wtでcalcOrientationHist(...)に渡された画像画素値にアクセスしようとするために発生し、できれば私は疑問に思い EDIT正常にパッチ理由私はCV_8UC1を意味するタイプ0を渡しますが、よく、私はsift.cpp at Line 330 and 331からこの部分をコピーしました。通常、SIFT記述子にはグレースケールイメージも必要ですか?

EDIT2 タイプを変更した後で、img.at<sift_wt>(...)ポジションは変更されません。だから私はソリューションを探検し、XCodeからGuardMalloc機能に着いた。それを有効にすると、新しいエラーが表示されました。これは、おそらくMallocエラーが発生する理由です。ライン77 of my Code。それは、この行で私を与えるエラーEXC_BAD_ACCESS (Code=1, address=....)次の行がありますされています

for(k = 0; k < len; k ++){ 
    int bin = cvRound((n/360.f)+Ori[k]); 
    if(bin >= n) 
     bin -=n; 
    if(bin < 0) 
     bin +=n; 
    temphist[bin] += W[k]*Mag[k]; 
} 

言及した変数の値は、以下の通りである: bin = 52, len = 169, n = 36, k = 0,W, Mag, Ori and temphistは表示されません。

ここGuadMalloc出力(申し訳ありませんが、私は本当にそれが望んで正確に理解いけない)

GuardMalloc[Test-1935]: Allocations will be placed on 16 byte boundaries. 
GuardMalloc[Test-1935]: - Some buffer overruns may not be noticed. 
GuardMalloc[Test-1935]: - Applications using vector instructions (e.g., SSE) should work. 
GuardMalloc[Test-1935]: version 108 
Test(1935,0x102524000) malloc: protecting edges 
Test(1935,0x102524000) malloc: enabling scribbling to detect mods to free blocks 

答えて

0

回答思考として簡単です... 問題は、そのFOR-でビンの計算で、でしたループが間違った値を出した。 ori[k]を追加する代わりに、ori[k]との乗算が必要です。 間違いがある52のビン値しかしtemphistが、私は本当にmallocのエラーをデバッグするGuardMallocまたはValgrindのを使用するようにrecomment同様のエラーを持っているすべての人のために38

であるために指していることを配列の長さになりました。

関連する問題