我尝试使用FAST创建一个描述符用于点检测和SIFT用于构建描述符。为此,我使用OpenCV。当我使用OpenCV的FAST时,我只使用部分SIFT代码,因为我只需要描述符。现在我有一个非常严重的malloc错误,我不知道如何解决它。我把我的代码发布到GitHub,因为它很大,我真的不知道错误来自哪里。我只知道,它是在DO-WHILE-Loop的末尾创建的:
features2d.push_back(features);
features.clear();
candidates2d.push_back(candidates);
candidates.clear();
}
}while(candidates.size() > 100);
正如你在GitHub的代码中看到的,我已经尝试释放应用程序的内存。Xcode分析说,我的应用程序使用9 Mb内存。我试着调试错误,但它是非常复杂的,我还没有找到任何线索,错误来自哪里。
编辑我想知道这个错误是否会发生,因为我试图访问传递给calcOrientationHist(…)的图像像素值与img.at<sift_wt>(...)
,其中typdef float sift_wt
在第56行,在我的代码中是57,因为通常我传递的Patch输出类型0
,这意味着它是CV_8UC1
,但是好吧,我从330行和331行的SIFT .cpp中复制了这部分通常,SIFT描述符也应该有灰度图像吗?
EDIT2 在img.at<sift_wt>(...)
位置更改类型后,没有任何更改。所以我谷歌了一下解决方案,找到了XCode的GuardMalloc功能。启用它会显示一个新的错误,这可能是我得到Malloc错误的原因。在我的代码第77行。它在这行给我的错误是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
答案很简单…问题是,在for循环中计算Bin时,得到了错误的值。而不是添加ori[k]
,它应该与ori[k]
相乘。这里的错误导致bin值为52。但是temphist
指向的数组的长度是38。
对于所有有类似错误的人,我真的建议使用GuardMalloc或Valgrind来调试Malloc错误。