2016-09-29 2 views
0

Я пытаюсь создать дескриптор, используя FAST для обнаружения точки и SIFT для создания дескриптора. Для этой цели я использую OpenCV. Хотя я использую FAST OpenCV, я просто использую части кода SIFT, потому что мне нужен только дескриптор. Теперь у меня очень неприятная ошибка malloc, и я не знаю, как ее решить. Я отправил свой код в GitHub, потому что он большой, и я не знаю, откуда происходит ошибка. Я просто знаю, что он создан в конце DO-WHILE-Loop:Malloc Ошибка: OpenCV/C++ while push_back Вектор

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

Как вы можете видеть в коде GitHub я уже пытался освободить память о Заявке. Xcode Analysis говорит, что мое приложение использует память 9 МБ. Я попытался отладить ошибку, но это было очень сложно, и я не нашел подсказки, откуда возникает ошибка.

EDIT Интересно, если это ошибка может произойти, потому что я пытаюсь получить доступ к Image Pixel значение передается calcOrientationHist (...) с img.at<sift_wt>(...) где typdef float sift_wt на линии 56 и 57 в моем коде, потому что обычно патч Я передаю выходы типа 0, что означает, что это CV_8UC1 Но ну, я скопировал эту часть из sift.cpp at Line 330 and 331 Обычно дескриптор SIFT должен также иметь изображение в оттенках серого или нет?

EDIT2 После изменения типа в img.at<sift_wt>(...) Позиция ничего не изменилось. Итак, я googled Solutions и приземлился на функцию GuardMalloc от XCode. Включение этого показало мне новую ошибку, которая, вероятно, является причиной, по которой я получаю ошибку 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

Ответ проще, так как мысль ... Проблема была, что при расчете Bin в формирова- петля ошибочное значение вышло. Вместо добавления ori[k] это должно быть умножение с ori[k]. Ошибки там в результате бен стоимости 52. Но длину массива, что temphist наведен на это 38.

Для всех, у кого есть подобные ошибки, я действительно рекомендую использовать GuardMalloc или Valgrind для отладки таНоса ошибки.

Смежные вопросы