2016-06-28 3 views
1

Я пытаюсь кодировать изображение bmp в jpg, используя функцию opencv (2.4.10), используя следующий код.Ошибка отладки во время opencv imencode

void test() 
{ 
    cv::Mat img = cv::imread("C:\\Users\\Maruf\\Pictures\\bingo.bmp", CV_LOAD_IMAGE_COLOR); 
    cv::vector<uchar> buf; 
    cv::imencode(".jpg", img, buf); 
    return; 
} 

В инструкции return выдается следующее исключение.

Почему это происходит и как я могу это исправить?

+0

Код кажется правильным. Кажется, что вы используете в своей конфигурации. Не забудьте подключиться к OpenGL debug libs в режиме отладки, а для освобождения libs в режиме выпуска. Также проверьте, что OpenCV построен с тем же компилятором, что и ваш проект. – Miki

ответ

2

Я уверен, что проблема может быть связана с использованием перекрестной версии msvc. Скажем, вы создаете код с помощью visual studio 10 и используете opencv dll & путь lib из msvc 11 или msvc 12. Большинство случаев это происходит, когда мы добавляем каталог opencv в путь среды. Я нашел аналогичную проблему для обнаружения blob, где я использовал визуальную студию 10 и с помощью папки opencv vc11 для DLL-файла lib &. После его изменения в vc10 он работал отлично.

Если у вас есть opencv, добавленный в путь к среде, пожалуйста, измените его и перезапустите визуальную студию. Также вам необходимо внести соответствующие изменения в путь к библиотеке проекта.

+0

Спасибо, что он работает. – qmaruf

0

Попробуйте изменить cv::vector<uchar> buf; на std::vector<uchar> buf;. Пространство имен cv не имеет объекта vector.

+0

Не работает. Такая же ошибка. – qmaruf

+0

@qmaruf Вы проверили, что ваш файл bmp существует? У меня нет проблемы с imencode на моей стороне (OpenCV 3.1.0). Также нет никаких проблем с оператором return (Visual Studio 2013, режим Debug). – Sunreef

+0

@gmaruf Убедитесь, что вы используете библиотеки отладки OpenCV. Использование библиотек выпусков в режиме отладки может (и почти всегда) приводить к ошибкам, связанным с повреждением памяти, как тот, который вы получаете. – Sunreef

0

Из-за opencv, связанного как динамическая библиотека, вам необходимо обязательно выделить и освободить память в том же адресном пространстве кучи.

ЬиЕ - было выделить память внутри сорте :: imencode (внутри DLL OpenCV), но релиз, когда это выходит за рамки (в другом кучного пространстве)

, например, в вас, например, вам нужно выделить память чего прийти перед тем как положить векторный контейнер в opencv-функцию cv::Mat img = cv::imread("C:\Users\Maruf\Pictures\bingo.bmp", CV_LOAD_IMAGE_COLOR); //for instance allocate 10Mb. std::vector buf(10 * 1024 * 1024); cv::imencode(".jpg", img, buf);

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