OpenCV cvLoadImage () не загружает изображения в отладчике Visual Studio?

Я пытаюсь разработать простой приветственный мир для OpenCV, но у меня заканчиваются идеи о том, почему он не работает.

Когда я компилирую и запускаю этот код:

#include <cv.h>
#include <highgui.h> 
int main(int argc, char* argv[])
{
 IplImage* img = cvLoadImage( "myjpeg.jpg" );
 cvNamedWindow( "MyJPG", CV_WINDOW_AUTOSIZE );
 cvShowImage("MyJPG", img);
 cvWaitKey(0);
 cvReleaseImage( &img );
 cvDestroyWindow( "MyJPG" );
 return 0;
}

У меня вместо указанного .jpg файла получается серая коробка размером примерно 200х200. Если я использую другой jpg, я получаю такое же окно, а если я вставляю недопустимое имя файла, я получаю очень маленькое окно (ожидаемое).

Я использую Visual Studio 2008 под Windows 7 Professional.

Большинство примеров программ, кажется, работают нормально, поэтому я вдвойне сбит с толку тем, как этот код прекрасно загружает образцы jpg, но в приведенном выше коде он не работает (даже попробовал образец jpeg).

Обновлять

Исполняемые файлы, созданные путем компиляции, работают нормально, однако отладчик Visual Studio 2008 загружает нулевой указатель в img каждый раз, когда я пытаюсь запустить отладчик, независимо от того, является ли расположение файла неявным или явным.


person Nerf42    schedule 22.01.2010    source источник
comment
На какой платформе вы компилируете программу? Можете ли вы проверить, действительно ли загружено изображение if(img == NULL) { std::cout ‹‹ Trouble ‹‹ std::endl; }   -  person midtiby    schedule 22.01.2010
comment
Дальнейшее тестирование показывает, что исполняемый файл отлично работает за пределами среды Visual Studio при условии, что файлы OpenCV .dll присутствуют в том же каталоге, но на самом деле img является нулевым указателем после вызова cvLoadImage() при запуске в среде отладки.   -  person Nerf42    schedule 22.01.2010
comment
Проблема может заключаться в том, что ваша программа не выполняется в том же каталоге, в котором находится файл изображения. (Это проблема, поскольку вы используете относительный путь)   -  person midtiby    schedule 22.01.2010
comment
Кажется, это проблема, связанная с отладчиком. Я заменил относительный путь на явный, и все равно переменная img возвращает нулевой указатель после cvLoadImage(), но исполняемый файл работает правильно (изображение отображается) при автономном запуске (с соответствующими локальными файлами).   -  person Nerf42    schedule 22.01.2010
comment
Какую версию OpenCV вы используете?   -  person Jacob    schedule 22.01.2010
comment
OpenCV2.0 — это используемая версия.   -  person Nerf42    schedule 22.01.2010


Ответы (4)


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

По умолчанию текущим каталогом, который использует отладчик Visual Studio, является каталог, содержащий файл .vcproj, но вы можете изменить его в свойствах проекта (Отладка -> Рабочий каталог).

Вы на 100% уверены, что правильно передаете абсолютный путь? Попробуйте передать тот же путь к fopen и посмотрите, возвращает ли он также NULL. Если да, то путь неверный.

Если вы хотите увидеть, какой именно файл пытается открыть библиотека, вы можете использовать Project Monitor. с фильтром по myjpeg.jpg.

person Catalin Iacob    schedule 22.01.2010
comment
Это сделало работу. .jpg находился в каталоге отладки с исполняемым файлом, а не в каталоге проекта с файлом vcproj. Я не знаю, почему явное объявление пути не сработает, я предполагаю, что всегда есть вероятность, что я неправильно передал явный путь. Всем большое спасибо! - person Nerf42; 22.01.2010
comment
@Catalin_lacob Мне нужна твоя помощь. Я попробовал то, что вы сказали. fopen не возвращает NULL, как и cvLoadImage, bt cvShowImage показывает серый ящик...... - person John Demetriou; 18.02.2013
comment
ничего, нашел, так как у меня не было waitkey и cvrelease потом не работало, не знаю почему - person John Demetriou; 18.02.2013

Какую версию OpenCV вы используете? Я пробовал ваш код на последней версии (OpenCV2.0), и он отлично работает. Вы можете скачать OpenCV2.0 с здесь.

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

person Jacob    schedule 22.01.2010
comment
Если это так, вам следует рассмотреть возможность использования класса Mat и функции imread — новый интерфейс C++ намного лучше :) - person Jacob; 22.01.2010

Попробуйте добавить HAVE_JPEG в определения препроцессора.

person oleole    schedule 25.06.2010

Я столкнулся с той же проблемой. Отладочная версия не загружает образ, но когда я компилирую и связываю его как релиз, он работает. надеюсь, это поможет

person Jeremy    schedule 02.11.2012