Повреждение кучи с использованием cv::FlannBasedMatcher и std::vector

Я разрабатываю функции визуализации груди для распознавания объектов, используя FlannBasedMatcher для вычисления пространственных гистограмм.

Mat ComputeSpatialHistogram(Mat features, Mat vocabulary, int* region_index, int level, Ptr<DescriptorMatcher> flann_matcher)
{
   int vocab_size = vocabulary.rows;
   Mat descriptor = Mat::zeros(1, vocab_size*my_pow(4, level), CV_32FC1);
   if (features.rows > 0)
   {
        vector<DMatch> matches;
        flann_matcher->match(features, matches);
        int word_idx, region_idx, descr_idx;
        for (int i = 0; i < matches.size(); i++){
            word_idx = matches[i].trainIdx;
            region_idx = region_index[i];
            descr_idx = vocab_size*region_idx + word_idx;
            descriptor.at<float>(0, descr_idx) = descriptor.at<float>(0, descr_idx) + 1.0f;
        }
    }
    return descriptor;
}

Я получаю сообщение об ошибке при завершении выполнения области if(features.rows > 0). Можете вы помочь мне?


person jperezmartin    schedule 11.06.2015    source источник
comment
Какую ошибку вы получаете?   -  person NathanOliver    schedule 11.06.2015
comment
Ваш код не проверяет, является ли region_index[i] допустимой записью массива. Вы используете i для обозначения двух разных вещей: одна — вектор, а другая — указатель на буфер, размер которого нам неизвестен. Эта функция должна либо принимать размер максимального числа значений region_index, либо быть переписана для использования std::vector‹int› для region_index. В любом случае цикл нужно переписать так, чтобы вы не переступили край и не начали индексировать недопустимые записи region_index. Если внесение этого изменения решит проблему, я сделаю это ответом. Прямо сейчас это комментарий к выполненному кодированию.   -  person PaulMcKenzie    schedule 11.06.2015
comment
Я получаю ошибку повреждения кучи.   -  person jperezmartin    schedule 11.06.2015
comment
@jperezmartin I get a heap corruption error Запись за пределы массива может привести к повреждению кучи. Это ошибки, которые я вижу в коде, который вы разместили, и я даже не знаю cv.   -  person PaulMcKenzie    schedule 11.06.2015
comment
Размер region_index и соответствий равен feature.cols, это не проблема.   -  person jperezmartin    schedule 11.06.2015
comment
Этот код, скомпилированный с помощью Visual Studio 2013, не вызывает ошибок, ошибка возникает при компиляции с помощью Visual Studio 2010.   -  person jperezmartin    schedule 11.06.2015
comment
@jperezmartin The size of region_index and matches is equal to features.cols, Если бы я получал доллар каждый раз, когда кто-то говорит, что это работает без моих доказательств, поверьте мне, я был бы богатым человеком. В дополнение к тому, что я сказал ранее, мы понятия не имеем, указывает ли этот указатель на допустимую память или нет. Помните, что вы получаете сбой, и это может быть вызвано всеми вещами, которые я упомянул.   -  person PaulMcKenzie    schedule 11.06.2015
comment
Размер region_index и соответствий равен feature.rows, это не проблема. И этот код, скомпилированный с Visual Studio 2013 и OpenCV 2.9, не выдает никаких ошибок, ошибка возникает при компиляции с Visual Studio 2010 и OpenCV 2.2.   -  person jperezmartin    schedule 11.06.2015
comment
Упоминание о том, что он работает с компилятором A и не работает с компилятором B, ничего не значит в мире C++. В коде все еще может быть ошибка, которая, казалось бы, работает. C++ имеет так называемое поведение *undefined, которого нет в большинстве других языков. До тех пор, пока не будет достоверного доказательства того, что это проблема компилятора или CV, тогда это ошибка в вашем коде, которая не проявляется в VS 2013 так, как ее можно увидеть.   -  person PaulMcKenzie    schedule 11.06.2015


Ответы (1)


Попробуйте поставить

matches.reserve(size) 

с фактическим размером вектора перед вставкой любого элемента. Это необходимо, если вы используете OpenCV 2.2, но не 2.9.

person fbr    schedule 11.06.2015