Jump to content
Compvision.ru
Vicul

MS Visual C++ и OpenCV

Recommended Posts

Всем привет,

прошу прощения за глупый вопрос. Подключить Visual C++ к OpenCV проблем нет, вопрос в другом - предположим, апп готово и его необходимо передать к заказчику, возможно ли сделать статическое апп, которое уже включало в себе все нужные библиотеки OpenCV, т.е. чтобы заказчику не нужно было устанавливать OpenCV? Или все таки необходимо поставлять апп с dll-ками OpenCV?

Share this post


Link to post
Share on other sites
Всем привет,

прошу прощения за глупый вопрос. Подключить Visual C++ к OpenCV проблем нет, вопрос в другом - предположим, апп готово и его необходимо передать к заказчику, возможно ли сделать статическое апп, которое уже включало в себе все нужные библиотеки OpenCV, т.е. чтобы заказчику не нужно было устанавливать OpenCV? Или все таки необходимо поставлять апп с dll-ками OpenCV?

существуют трюки, при помощи которых можно впаять dll в exe- шник, правда , скорее всего попыхтеть придется. Есть еще вариант - тулза dll2lib по моему называется может быть она поможет сам правда ее не тестил нормально.

Share this post


Link to post
Share on other sites

А если DLL-ки засунуть в инстал-пак приложения и и бросать их в папку приложения при сетапе, никто не пробовал? Или все таки OpenCV требует некоторых изменений в реестре, при установке этого пакета?

Share this post


Link to post
Share on other sites
А если DLL-ки засунуть в инстал-пак приложения и и бросать их в папку приложения при сетапе, никто не пробовал? Или все таки OpenCV требует некоторых изменений в реестре, при установке этого пакета?

Так можно сделать, в версии 1.0 надо было еще видеофильтры зарегистрировать, там есть bat файл специальный. А в 1.1 я такого не нашел, наверное теперь не нужно ничего регистрировать. Единственное что, IPP работать так скорее всего не будет. И MSVCR надо не забыть.

Share this post


Link to post
Share on other sites
Единственное что, IPP работать так скорее всего не будет. И MSVCR надо не забыть.

С IPP еще не работал, но думаю без этого пакета не обойтись. Поэтому интересно, как вы передаете все это заказчику. Скажем если прога на писана на MSVC++, здесь проблем нет - лицензия моя и все ехе-шники будут легальны. С OpenVC тоже проблем нет - пакет распостраняется свободно. А как быть с IPP? Я слышал, что это пакет уже коммерческий, и заказчику необходимо его покупать? Вопрос с лицензиями у меня один из основных, потому что клиенты у меня "из-за бугра".

Share this post


Link to post
Share on other sites
С IPP еще не работал, но думаю без этого пакета не обойтись. Поэтому интересно, как вы передаете все это заказчику. Скажем если прога на писана на MSVC++, здесь проблем нет - лицензия моя и все ехе-шники будут легальны. С OpenVC тоже проблем нет - пакет распостраняется свободно. А как быть с IPP? Я слышал, что это пакет уже коммерческий, и заказчику необходимо его покупать? Вопрос с лицензиями у меня один из основных, потому что клиенты у меня "из-за бугра".

IPP хорошая штука, 1 коммерческая лицензия стоит 200$ но если Вы её используете, то вряд ли Ваш продукт стоит меньше 2000$ - 3000$, так что здесь, как раз большой проблемы нет, причем если нужно несколько лицензий Вам дают какие то скидки.

Вот ссылка на страничку с ценами: страничка с ценами

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Обидненко конечно, что тему-то со статическими lib-ами так и не раскрутили. Надеюсь кто-то действительно поделится личными знаниями.

А что не получается? Поменять в свойствах проекта тип с dll на lib?

Share this post


Link to post
Share on other sites

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

Недавно я написал маленькую программу с использованием OpenCV 1.1 и мне бы хотелось ее выложить в интернет. Но я ни как не могу понять, что нужно сделать для того что-бы она запускалась и у других людей у кого не установлена OpenCV. Если можете скажите как это сделать.

Использовал я Microsoft Visual c++ Express.

Share this post


Link to post
Share on other sites

Необходимо в свойствах твоего проекта в Release конфигурации C++ -> Code Generation -> Runtime library выставить "Multi threaded".

Эти же действия проделать со всеми dll из OpenCV. Перекомпилировать их. Перекомпилировать свой проект.

Поставлять свой exe и используемые dll из OpenCV.

Share this post


Link to post
Share on other sites

Спасибо большое за ответ.

С первой частью я справился :) А насчет dll, не могли бы вы подробнее описать?

Share this post


Link to post
Share on other sites

У меня в папке с OpenCV есть _make. Там лежит файл opencv.vs2005.sln, который открываем 2005-й студией (или более поздней версией). В свойствах каждого проекта, которые отображаются в окне Solution Explorer'a выставляется "Multi threaded". Делается полная перекомпиляция "Rebuild solution". Из папки bin забираются необходимые dll.

Share this post


Link to post
Share on other sites

Я наверное безнадежен=)

Проделал все что вы сказали. Для каждого проекта сделал полную перекомпеляцию, но вот когда начинаю компелировать свой проект с опцией "Multi threaded", он мне выдает ошибку связанную с LINK. Что мы сделали поменяв настройку "Multi threaded"? Теперь к проекту нужно подключить dll?

Share this post


Link to post
Share on other sites
Я наверное безнадежен=)

Проделал все что вы сказали. Для каждого проекта сделал полную перекомпеляцию, но вот когда начинаю компелировать свой проект с опцией "Multi threaded", он мне выдает ошибку связанную с LINK. Что мы сделали поменяв настройку "Multi threaded"? Теперь к проекту нужно подключить dll?

Нет, ничего подключать не нужно. Наоборот, все необходимые dll прилинкованы в виде статических библиотек (lib-файлов). Если бы ты назвал имя ошибки(ок), было бы проще тебе ответить. Unresolved external? Или, наоборот, always defined? В первом случае, надо добавить необходимые lib, во втором посмотреть в свойства линкера, вдруг в ignored input library указаны необходимые тебе библиотеки.

Вообще, сборка больших С++ проектов довольно сложная задача из-за своей громоздкости (есть даже специальность - инженер по сборкам). Но процесс логичен и детерменирован, разрулить можно всегда. Ошибки в студию!

Share this post


Link to post
Share on other sites

Спасибо за помощь я просто никогда не работал с большими библиотеками на С++.

когда я ставлю в проекте MT то он мне выдает

1>Компоновка...

1>LINK : warning LNK4098: библиотека по умолчанию "LIBCMT" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library

1>libcpmtd.lib(xdebug.obj) : error LNK2019: ссылка на неразрешенный внешний символ __malloc_dbg в функции "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)

1>libcpmtd.lib(xdebug.obj) : error LNK2019: ссылка на неразрешенный внешний символ __free_dbg в функции "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z)

1>C:\Documents and Settings\DartSidius\Desktop\testMV - OpenCV2\Debug\testMV.exe : fatal error LNK1120: 2 неразрешенных внешних элементов

1>Журнал построения был сохранен в "file://c:\Documents and Settings\DartSidius\Desktop\testMV - OpenCV2\testMV\Debug\BuildLog.htm"

1>testMV - ошибок 3, предупреждений 3

========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ==========

Если поставить MDd то всё нормально работает. Может я где то не так сделал, попробую ещё раз всё с начала.

Я сейчас использую 1.1 может быть лучше будет использовать OpenCV 2.0?

Share this post


Link to post
Share on other sites

Всё нормально. Посмотри в свойствах проекта, свойства linker'а, раздел Input. Если найдёшь там где-нибудь LIBCMT, то удали.

Share this post


Link to post
Share on other sites

Библиотеки LIBCMT в input нету. Может быть какая то ошибка при компиляции библиотек, потому что он когда я компилировал их повторно возникли ошибки.

При компиляции проекта cvaux он выводит Rebuild All: 1 succeeded, 2 failed, 0 skipped. Такого же не должно быть? Я даже не представляю почему такое происходит.

А какую версию microsoft visual вы используете?

3> Compiling...

3> cvfindhandregion.cpp

3> cvfindface.cpp

3> cvfacetemplate.cpp

3> cvfacedetection.cpp

3> cvface.cpp

3> cvepilines.cpp

3> cveigenobjects.cpp

3> cvdpstereo.cpp

3> cvcreatehandmask.cpp

3> cvcorrimages.cpp

3> cvcorrespond.cpp

3> cvcalibfilter.cpp

3> cvbgfg_gaussmix.cpp

3> cvbgfg_common.cpp

3> cvbgfg_codebook.cpp

3> cvbgfg_acmmm2003.cpp

3> cvauxutils.cpp

3> cvaux.cpp

3> cv3dtracker.cpp

3> camshift.cpp

3> Generating Code...

3>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(935,5): warning MSB8012: TargetPath(C:\DOCUME~1\DARTSI~1\LOCALS~1\Temp\opencv.build\cvaux_Debug.Win32\cvaux.dll) does not match the Linker's OutputFile property value (E:\Program Files\OpenCV\bin\cvaux110d.dll). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile).

3>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(937,5): warning MSB8012: TargetName(cvaux) does not match the Linker's OutputFile property value (cvaux110d). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile).

3>Link:

3> Creating library ..\..\lib/cvauxd.lib and object ..\..\lib/cvauxd.exp

3>cv3dtracker.obj : error LNK2019: unresolved external symbol __CrtDbgReportW referenced in function "public: bool __thiscall std::_Tree_const_iterator<class std::_Tree_val<class std::_Tmap_traits<int,int,struct std::less<int>,class std::allocator<struct std::pair<int const ,int> >,0> > >::operator==(class std::_Tree_const_iterator<class std::_Tree_val<class std::_Tmap_traits<int,int,struct std::less<int>,class std::allocator<struct std::pair<int const ,int> >,0> > > const &)const " (??8?$_Tree_const_iterator@V?$_Tree_val@V?$_Tmap_traits@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@$0A@@std@@@std@@@std@@QBE_NABV01@@Z)

3>libcpmtd.lib(stdthrow.obj) : error LNK2001: unresolved external symbol __CrtDbgReportW

3>..\..\bin/cvaux110d.dll : fatal error LNK1120: 1 unresolved externals

3>

3>Build FAILED.

3>

3>Time Elapsed 00:00:11.96

========== Rebuild All: 1 succeeded, 2 failed, 0 skipped ==========

Share this post


Link to post
Share on other sites

2005-ю студию использую. И ошибки какие-то странные у тебя. Если хочешь могу скинуть скомпилированные lib и dll, которые не тербую ничего лишнего.

Share this post


Link to post
Share on other sites

Спасибо за библиотеки, но все равно тоже самое. Я попробовал на другом компьютере и тоже ничего. Непонятно почему такое происходит. Скорее всего надо использовать Microsoft Visual 2005, версия 1.1 разрабатывалсь на нем, наверное в более поздние версии были внесены какие то критичные для библиотеки изменения. Постараюсь установить 2005й, хотя может что то не то всё же я сделал.

Список библиотек которые я подключаю:

  • cv.lib
  • cvaux.lib
  • cvauxd.lib
  • cvd.lib
  • cvhaartraining.lib
  • cxcore.lib
  • cxcored.lib
  • cxts.lib
  • cxtsd.lib
  • highgui.lib
  • highguid.lib
  • ml.lib
  • mld.lib

Может быть что-то лишнее?

Если вам не трудно не могли бы вы скомпелировать мою программу, вот исходный код. Эта маленькая программа демонстрирующая работу генетического алгоритма.

Share this post


Link to post
Share on other sites
Может быть что-то лишнее?

Да, из них надо подключить только 3: cv.lib, cxcore.lib, highgui.lib. И, соответственно, брать с собой 3 dll: cv110.dll, cxcore110.dll, highgui110.dll.

Твой код скомпилировал, вот здесь. В папке release лежит готовый exe и необходимые к нему 3 dll.

Share this post


Link to post
Share on other sites

Спасибо огромное вам за помощь. Очень хотелось довести до логического конца эту программу. Не поверите ваш проект компелируется, создал новый с тем же исходным кодом, что и у вас никакие библиотеки не подключал больше, поставил MT и снова тоже самое, ни как не хочет. Видимо и впрямь нужно пользоваться 2005.

Share this post


Link to post
Share on other sites

Наверняка можно и другой студией откомпилировать. У меня ещё стоит бета2 2010-й, могу попробовать. Но лучше тебе самому изучить тонкости компилирования и линковки (если, конечно, ты будешь работать С++ программистом).

P.S. Посмотрел внимательней, у тебя ещё и cv.lib с cv110.dll лишние.

Share this post


Link to post
Share on other sites

Всем привет,

опять поднимю эту тему, на этот раз с новой версией openCV2.0. Дело в том, что возникла проблема переноса проги с новыми длл-ками от 2.0 на другой комп, где нет openCV. При запуске проги получаю собщения типа

The Application Failed To Initialize Properly (0xc0150002) итд.

Хотя все нужные длл с OpenCV/Bin находятся в каталоге, где и прога.

Перечисляю шаги

1. Vista и VS2005 с SP1.

2. Скачиваю openCV2.0 и устанавливаю пакет.

3. С помощью CMake делаю конфигурацию. Получаю каталоги с проектом для VS2005.

4. Запускаю этот проект и компилирую его. Здесь приходиться использовать опцию (Runtime Library) MD и MDd. Пытался использовать MT и MTd - не проходит, куча ошибок (за 600 перевалило, не находит переменные).

5. вообщем вернулся к MD и MDd. После компиляции получаю несколько ошибок на проекты ( не ДЛЛ-очные , типа тест и тд). Игнорирую их, т.к. все длл-ки и lib-ы сформировались как для дебагера, так и для релиза.

6. Прописываю пути к длл-кам OpenCV/Bin/debug и OpenCV/Bin/release в Виндовом окружении.

7. Прописываю пути к инклуде и к либам (для дебага и релиза) в VS2005. Перезагружаю комп.

8. Загружаю свой проект, с Runtime Library: Mtd и Mt. Перейти на MD и MDd не могу, у меня статический проект с MFC.

9. Компилирую проект - проблем нет, получаю дебаг и релиз версии проги.

10. Программа простая - вызов диалогового окна через MFC и по кнопке вызов трейда с функциями OpenCV: загрузить имидж и показать его в окне от OpenCV и потом по ESc закрыть его. Вообщем прога работает как в дебаге, так и в релизе.

11. На другой комп с XP переношу релизовую копию и длл-ки от OpenCV/Bin запускаю и получаю

The Application Failed To Initialize Properly (0xc0150002)...

Вообщем сижу второй день, не могу обойти это. А ставить на другой комп OpenCV не хочу, задача требует запуск проги без установки OpenCV. Любые идеи????

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×