суббота, 11 августа 2012 г.

Работаем с OpenCV из Visual Studio 2010 Express (C++)

OpenCV имеет обёртки (wrapper'ы) под большое количество языков программирования, но, конечно, когда речь идёт о максимальном быстродействии, то остаётся только один (два) язык: С/С++. Попробуем рассмотреть процесс "установки" OpenCV 2.4.2 под MSVS 2010 Express Edition (взять можно здесь, нужна соответственно версия для С++).
OpenCV можно скачать здесь. Просто укажите папку, в которую необходимо распаковаться (это может быть просто диск "С:\" - и я даже рекомендовал бы распаковать библиотеку именно туда. Файлы не перемешаются, будьте спокойны).


Предполагается, что у вас IDE уже установлена и готова к работе. Нажимаем "File  New  Project":




Выбираем "Win32 Console Application":
Вводим имя нашего проекта (<Enter_name>) "OpenCV_HelloWorld", нажимаем "OK" и "Finish".
Затем слева, в "Solution Explorer" необходимо щелкнуть правой кнопкой мыши по своему проекту, выбрать "Properties".

Идём во вкладку "Configuration properties → VC++ Directories". 
Здесь нас интересуют две строки: Include и Library Directories. Пусть папка, в которую вы распаковали OpenCV располагается в "C:\Opencv". 
Тогда в строку Include Directories нам необходимо добавить "C:\Opencv\build\include\opencv" и  "C:\Opencv\build\include\". 

В строку Library Directories необходимо добавить строку "C:\Opencv\build\x86\vc10\lib". Естественно, если вы используете другую версию Visual Studio, то вместо "vc10" должны быть соответственно "vc9" или "vc8".

Теперь нас интересует вкладка "Configuration properties → Linker → Input". В эту строку надо добавить следующее:
opencv_core242d.lib
opencv_imgproc242d.lib
opencv_highgui242d.lib
opencv_ml242d.lib
opencv_video242d.lib

Как несложно догадаться, последние цифры в названиях файлов - это номер версии OpenCV. Так что если вы используете, к примеру, версию 2.4.4, то файл opencv_core242d.lib надо переименовать в opencv_core244d.lib (и так все остальные), и смело копипастить отсюда в IDE.

Всё! Можно писать первую простенькую программку. Не забывайте инклюдить необходимые заголовки.
Тестовая программка:

#include "stdafx.h"

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int _tmain(int argc, _TCHAR* argv[])
{
    IplImage* frame=cvLoadImage("C:\\Users\\Василий\\Desktop\\2.jpg",1);

    cvSmooth(frame,frame,CV_BLUR,3,0,2.0,2.0); // Немножко размоем изображение. Просто так,
                                                   //чтобы потрогать функции OpenCV

    if(frame==NULL){ /* Если вдруг такой картинки нет */
        printf("Кажется этот файл не существует");
        exit(0);
    }

    cvNamedWindow("Hi", CV_WINDOW_AUTOSIZE );
    cvShowImage("My Window",frame);
    cvSaveImage("image.jpg",frame);
     
    cvWaitKey();/* Ждем, пока вы что-нибудь не нажмете, 
                       иначе окошко просто "мелькнет" и вы
                       можете даже ничего не заметить */
    cvDestroyWindow( "Hi" );
 
return 0;
}
Подставляем свой путь до картинки (не забываем экранировать слеши, т.е. вместо одного просто писать их два). Нажимаем F5 и...

УРА! Что-то я не сообразил, какую картинку ещё можно поставить, кроме как скриншот.
Если остались вопросы - задавайте в комментарии.


16 комментариев:

  1. Все делал по инструкции, но когда вставил ваш код в проект и нажал F5 вышло такое:
    http://s019.radikal.ru/i604/1210/00/f47c16dd2b06.jpg

    Причем
    та библиотека в opencv есть! Я добавил её ещё в папку windows32, но не помогло.

    ОС Windows 7 x64

    ОтветитьУдалить
  2. Здравствуйте! В 64-разрядных системах библиотеки надо класть в папку "C:/Windows/SysWOW64"! Необходимые вам библиотеки находятся в папке opencv\build\x86\vc10\bin и в папке opencv\build\common\tbb\ia32\vc10 (нужны только dll'ки). Я особо не задумывался и просто скопировал их все в системную папку, но при распространении программы, конечно, нужно знать какие библиотеки не нужны, чтобы не таскать их мертвым грузом.
    Удачи!

    ОтветитьУдалить
  3. Здравствуйте. Подскажите пожалуйста можно ли с помощью openCV определять предметы на изображении???

    ОтветитьУдалить
  4. Здравствуйте. Хочу дополнить, применительно к VS2010 x86.
    Во избежание сообщений об ошибках обнаружения dll, нужно:
    1) В переменную среды PATH нужно добавить путь к либам dll: путь_к_opencv\build\x86\vc10\bin
    2) Скачать с http://threadingbuildingblocks.org/ последний TBB. Взять из скачанного архива файл tbb_debug.dll и положить в папку с программой.

    ОтветитьУдалить
  5. Здравствуйте, Василий

    У меня на работе такая задача: над конвейером по которому движутся таблетки висит камера, снимающая с определенной частотой. По снимкам требуется отбраковать таблетки по их контуру и цвету.

    В общих чертах написал программу на матлабе, но он очень медленный.

    Когда то я программировал на vb6 и чуть-чуть на С. Думаю сейчас написать тот же код на Visual C++ Express 2010. Затем надо будет передать программу для программиста для процессора.

    Что Вы мне посоветуете? Не уверен, что сам без помощи смогу освоить С++ и OpenCV.

    Не знаю за что браться, с чего начать, по каким книгам изучать.

    ОтветитьУдалить
  6. Здравствуйте! Задача не выглядит очень сложной, можно попробовать сделать. А не могли бы вы прислать пару фотографий (желательно с пометками, какие объекты отбракованы), и я попробую помочь.
    vas.gerasimchuk@gmail.com

    ОтветитьУдалить
  7. Сделал всё плюс
    Во избежание сообщений об ошибках обнаружения dll, нужно:
    1) В переменную среды PATH нужно добавить путь к либам dll: путь_к_opencv\build\x86\vc10\bin
    2) Скачать с http://threadingbuildingblocks.org/ последний TBB. Взять из скачанного архива файл tbb_debug.dll и положить в папку с программой.

    При запуске отладки выдаёт
    "ошибка при инициализации приложения 0xc0150002"
    что делать

    ОтветитьУдалить
  8. Большое спасибо, только по вашему посту смог наконец подключить эту несчастную OpenCV

    ОтветитьУдалить
  9. Спасибо огромное. Только с помощью вашего поста подключил.

    ОтветитьУдалить
  10. А что в РATn писать я его изменил и что делать не знаю.

    ОтветитьУдалить
  11. Здравствуйте! Сделала всё по инструкции, почему-то мне выдались ошибки:
    1>------ Построение начато: проект: OpenCVhelloworld, Конфигурация: Debug Win32 ------
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvDestroyWindow в функции _wmain
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvWaitKey в функции _wmain
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvSaveImage в функции _wmain
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvShowImage в функции _wmain
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvNamedWindow в функции _wmain
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvSmooth в функции _wmain
    1>OpenCVhelloworld.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _wmain
    1>D:\VS\openCV\OpenCVhelloworld\Debug\OpenCVhelloworld.exe : fatal error LNK1120: 7 неразрешенных внешних элементов
    ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

    Подскажите пожалуйста, что я не так могла сделать? С уважением, Клавдия

    ОтветитьУдалить
  12. Здравствуйте! Помогите пожалуйста! у меня ошибка он не может запустить файл C:\Users\Ardak\Documents\Visual Studio 2010\Projects\OpenCV_HelloWorld\Debug\OpenCV_HelloWorld.exe

    ОтветитьУдалить
  13. А как установить на VisualStudio2005
    Судя по описанию нужна папка VC8 а там только с vc10 начинается

    ОтветитьУдалить
  14. Была ошибка что библиотека не найдена. Нужно было скопировать в сорс папку (где хранится .ехе файл) библиотеки (.dll)

    ОтветитьУдалить
  15. Хлуденьков Владимир17 июля 2015 г. в 15:10

    Ставил OpenCV 2.4.11 на VS2010. Там действительно пришлось поработать.

    Ещё пути к dll пихал в "дополнительные зависимости"

    И PATH модернизировал.

    ОтветитьУдалить
  16. Хлуденьков Владимир17 июля 2015 г. в 15:14

    Ставил OpenCV 2.4.11 на VS2010. Там действительно пришлось поработать.

    Ещё пути к dll пихал в "дополнительные зависимости"

    И PATH модернизировал.

    ОтветитьУдалить