2016-09-29 83 views
0

我嘗試創建一個描述符使用FAST的點檢測和SIFT構建描述符。爲此,我使用OpenCV。雖然我使用OpenCV的FAST,但我只是使用SIFT代碼的一部分,因爲我只需要描述符。現在我有一個非常討厭的malloc錯誤,我不知道如何解決它。我將代碼發佈到GitHub,因爲它很大,我不知道錯誤來自哪裏。我只知道,這是在該DO-while循環結束時創建:Malloc錯誤:OpenCV/C++,同時push_back矢量

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

正如你可以在GitHub上的代碼,看到我已經嘗試過以釋放申請的內存。 Xcode分析說,我的應用程序使用9 MB內存。我試圖調試錯誤,但它非常複雜,我還沒有發現錯誤來自哪裏的任何線索。

編輯 如果可能會出現這個錯誤,因爲我嘗試用img.at<sift_wt>(...)其中typdef float sift_wt來訪問傳遞給calcOrientationHist(...)的圖像像素值在第56行,並在我的代碼57,我不知道是因爲正常的補丁我通過輸出類型0這意味着它是一個CV_8UC1但是,我從sift.cpp at Line 330 and 331複製這部分通常SIFT描述符應該也有一個灰度圖像?

EDIT2 更改img.at<sift_wt>(...)中的類型位置沒有任何變化。所以我使用Google搜索解決方案,並從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

答案是思想簡單... 的問題是,在濱在有關─計算循環錯誤的值出來了。它應該是與ori[k]的乘法,而不是添加ori[k]。 錯誤導致了一個二進制值爲52.但是temphist指向的陣列長度爲38.

對於所有有類似錯誤的人,我真的推薦使用GuardMalloc或Valgrind來調試Malloc錯誤。