Перейти к содержимому
Compvision.ru
Vicul

MS Visual C++ и OpenCV

Recommended Posts

Всем привет,

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Всем привет,

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Единственное что, IPP работать так скорее всего не будет. И MSVCR надо не забыть.

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

Поделиться сообщением


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я наверное безнадежен=)

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

когда я ставлю в проекте 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Библиотеки 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 ==========

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за библиотеки, но все равно тоже самое. Я попробовал на другом компьютере и тоже ничего. Непонятно почему такое происходит. Скорее всего надо использовать 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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Может быть что-то лишнее?

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет,

опять поднимю эту тему, на этот раз с новой версией 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. Любые идеи????

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×