API OpenCV 2.0 C++ с использованием imshow: возвращает необработанное исключение и "плохой флаг"

Я пытаюсь использовать новый API OpenCV 2.0 в MS Visual C++ 2008 и написал эту простую программу:

cv::Mat img1 = cv::imread("image.jpg",1);
cv::namedWindow("My Window", CV_WINDOW_AUTOSIZE);
cv::imshow("My Window", img1);

Visual Studio возвращает необработанное исключение, а консоль возвращает:

OpenCV Error: bad flag (parameter or structure field) 
(Unrecognized or unsupported array type) in unknown function, 
file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376

Изображение не отображается. Кроме того, у окна "Мое окно" есть странная надпись: "Мое окно", которое не зависит от названия.

"Старый" C API, использующий такие команды, как cvLoadImage, cvNamedWindow или cvShowImage, без проблем работает с тем же файлом изображения. Я пробовал много разных вещей без успеха.

Я ценю любую помощь здесь.

Konrad

6 ответов

Решение

Там есть помощь по этому вопросу.

Решение состоит в том, что обычно предлагаемые файлы библиотеки opencv в компоновщике не работают должным образом. Вместо этого попробуйте использовать файлы библиотеки отладки следующим образом:

В Visual C++:

Перейдите в Project->Properties (или Alt-F7) Свойства конфигурации->Linker->Input-> Дополнительные зависимости

замените обычный cv210.lib cxcore210.lib highgui210.lib на cv210d.lib cxcore210d.lib highgui210d.lib - библиотеки отладки.

Команды API OpenCv 2.0 теперь должны работать.

Как я только что прокомментировал, imread у меня тоже не работает Небольшой поиск в Google показывает другим людям, имеющим ту же проблему; Я думаю, это ошибка в коде библиотеки. А пока вот хакерский обходной путь:

IplImage* img = cvLoadImage("lena.jpg");
cv::Mat lena(img);
cvReleaseImage(&img);

Таким образом, вы можете по крайней мере использовать API C++ для всего остального.

У меня была та же проблема, описанная выше, которая, как оказалось, вызвана настройками компоновщика.

Я нашел ответ в другой теме, OpenCV 2.3 и Visual Studio 2010.

Чтобы повторить это здесь:

Свойства вашего проекта (щелкните по нему правой кнопкой мыши)

  • C / C++
    • генеральный
      • каталог include добавьте <ваш каталог>\OpenCV2.3\include\opencv2, <ваш каталог>\ OpenCV2.3 \ include \ opencv и <ваш каталог>\ OpenCV2.3 \ include
  • Linker

    • генеральный
      • Элемент списка
    • вход
      • Добавьте все библиотеки, например opencv_core230d.lib opencv_highgui230d.lib и так далее...

После того как я сделал выше, я могу запустить imshow а также imread + все остальные функции cpp без проблем! Проблема ОП, вероятно, уже решена, но, надеюсь, это будет полезно для других людей, которые ведут сюда, ища такое же решение.

Во-первых, вам лучше скомпилировать собственную версию OpenCV.

У меня была та же ошибка со сборкой (я получил от Sourceforge), и она была решена путем компиляции моей собственной версии в версиях отладки и выпуска.

И убедитесь, что вы изменили исходную системную переменную env PATH в новую папку сборки build/binтогда вы могли бы построить и запустить imshow() в режиме отладки.

Вы уверены, что добавили весь путь, начиная с /home/..., У меня была та же проблема, что и у вас, но когда я добавил весь путь, все сложилось довольно хорошо. Весь путь должен быть добавлен, несмотря на тот факт, что путь существует во включаемых файлах.

imread в openCV в отличие от Matlab не возвращает ошибку, когда файл / папка не найдена - вместо этого он возвращает нулевую матрицу, которая, в свою очередь, отражается как ошибка во время imshow, Также, imread не ищет файлы изображений во включенных папках или рабочей области. Таким образом, указывайте весь путь всякий раз, когда это возможно.

Пожалуйста, обратите внимание на это для будущих ссылок.

Я считаю, что это может быть связано с Unicode.

Попробуй макрос _TEXT()

Например:

cv::Mat img1 = cv::imread(_TEXT("image.jpg"),1);

Юникод в Visual C++ 2

Другие вопросы по тегам