API OpenCV 2.0 C ++ с использованием imshow: возвращает необработанное исключение и «плохой флаг» - PullRequest
6 голосов
/ 12 апреля 2010

Я пытаюсь использовать новый 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 ]

6 голосов
/ 16 апреля 2010

Есть помощь по этой проблеме.

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

В Visual C ++:

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

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

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

6 голосов
/ 12 апреля 2010

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

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

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

3 голосов
/ 05 октября 2012

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

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

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

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

  • C / C ++
    • Общая информация
      • включает каталог и добавляет <ваш каталог> \OpenCV2.3 \ include \ opencv2, <ваш каталог> \ OpenCV2.3 \ include \ opencv и <ваш каталог> \OpenCV2.3 \ include
  • Linker

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

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

2 голосов
/ 29 июня 2011

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

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

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

2 голосов
/ 30 апреля 2011

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

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

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

0 голосов
/ 07 февраля 2011

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

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

Например:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...