2016-09-29 59 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错误。