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);