суббота, 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 комментариев:

KaiM комментирует...

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

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

ОС Windows 7 x64

Unknown комментирует...

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

Анонимный комментирует...

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

Максим комментирует...

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

Tur комментирует...

Здравствуйте, Василий

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

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

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

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

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

Unknown комментирует...

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

Анонимный комментирует...

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

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

Анонимный комментирует...

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

Анонимный комментирует...

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

Анонимный комментирует...

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

Анонимный комментирует...

Здравствуйте! Сделала всё по инструкции, почему-то мне выдались ошибки:
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 ==========

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

Анонимный комментирует...

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

Sergey1985 комментирует...

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

Анонимный комментирует...

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

Хлуденьков Владимир комментирует...

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

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

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

Хлуденьков Владимир комментирует...

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

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

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