步骤:
① 编译opencv源码;注意几个下载内容;根据cmakedownloadlog.txt中的说明
② 生成opencv.sln,先使用ALL_BUILD生成
③ 然后对install工程进行生成
④ 使用:离线使用,opencv文件夹 install的include lib bin 等复制到当前工程下的文件夹;然后配置属性
配置属性时注意一下路径,工程属性为.vcxproj 文件所在路径;去找相对路径时,其基础路径不一样,注意。
⑤ 编译成功,debug调试;成功
- 下载opencv & opencv-contrib 4.7.0源码;注意下载地址
- https://github.com/opencv/opencv/releases https://github.com/opencv/opencv_contrib/releases/tag/4.7.0 版本要一模一样
- cmake输出文件夹为:opencv-4.7.0-build
- 参考教程:VS + OpenCV + cmake,源码编译,使用及调试_拜阳的博客-CSDN博客_vs+opencv+cmake
- Windows 下 Cmake 编译 OpenCV + opencv_contrib 模块总结_windows编译opencv 4.5.1报错_Chris_zhangrx的博客-CSDN博客
0. cmake配置
- 取消TEST工程生成;
- 取消CUDA选项
- 勾选opencv_world选项
- 填入contrib路径:OPENCV_EXTRA_MODULES_PATH
遇到下载问题如下:
1. ippicv
- 解决方法:打开opencv-4.7.0-build下的CMakeDownloadLog.txt文件,依次下载相应文件到相应文件夹;且命名格式为87974*
2. ffmpeg
-
对ffmpeg.cmake的下载指令进行屏蔽;同时根据上面的下载日志进行替换;
-
否则,一直重新下载覆盖原来下载的内容;由于下载一直失败,导致编译无法继续进行!!
-
-
下载ffmpeg_vesion.cmake到H:\opencv\opencv-4.7.0-build\3rdparty\ffmpeg 路径下;
-
- cmake成功;
3. 添加contrib路径;
- 勾选Build->Build_opencv_world:在Build下面,此处勾选BUILD_opencv_world是为了后续在生成OpenCV动态库的时候,会生成一个总的opencv_world的库,不然每个模块都会生成一个库,使用比较麻烦
- 此处在OPENCV_EXTRA_MODULES_PATH地方添加opencv_contrib里面的modules模块路径,用来集成该部分源代码。
- 生成Opencv.sln,点击All-Build工程,生成;
3.1 wechat_qrcode下载代码屏蔽
3.2 屏蔽 xfeature2d的两个cmake的下载内容,然后根据CMakeDownloadLog.txt链接下载相应文件
3.3 testdata/cv/face/face_landmark_model.dat
下载后放在相应文件夹后,configure done。成功;开始生成工程
3.4 没有VTK路径,WITH_VTK取消勾选
A library with LAPACK API not found. Please specify library location.
VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file
CMake Error at cmake/OpenCVModule.cmake:356 (_glob_locations):
Syntax error in cmake code at
J:/opencv/opencv-4.7.0/cmake/OpenCVModule.cmake:356
when parsing string
J:\opencv\opencv_contrib-4.7.0\modules
Invalid character escape '\o'.
Call Stack (most recent call first):
cmake/OpenCVModule.cmake:385 (ocv_glob_modules)
CMakeLists.txt:951 (ocv_register_modules)
3.5 contrib路径问题:Invalid character escape '\O' 右划线不行,得要左划线
A library with LAPACK API not found. Please specify library location.
CMake Error at cmake/OpenCVModule.cmake:356 (_glob_locations):
Syntax error in cmake code at
J:/opencv/opencv-4.7.0/cmake/OpenCVModule.cmake:356
when parsing string
J:\opencv\opencv_contrib-4.7.0\modules
Invalid character escape '\o'.
Call Stack (most recent call first):
cmake/OpenCVModule.cmake:385 (ocv_glob_modules)
CMakeLists.txt:951 (ocv_register_modules)
4. 解决方案报 LNK1104 无法打开文件 “python38_d.lib”
原因: 这是因为使用的 python 是 Release 版,而编译是在 Debug 模式下编译的(Release 模式下没有此问题)
在 python 的安装位置找到 include 文件夹,在文件夹下找到 pyconfig.h 文件
因为我用的是anaconda3装的,所以我的 pyconfig.h 位置为 D:\Programs\anaconda3\include\pyconfig.h
将 comment(lib,"python38_d.lib") 改为 comment(lib,"python38.lib")
————————————————
版权声明:本文为CSDN博主「ZChen1996」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZChen1996/article/details/115998472
编译成功,Done!
使用编译的opencv库进行源码debug
VS + OpenCV + cmake,源码编译,使用及调试_拜阳的博客-CSDN博客_vs+opencv+cmake
源码opencv编译后会生成一些.pdb的文件,这些文件是调试的关键。
- 在VS解决方案管理器展开CMakeTargets,右键点击INSTALL,然后点击生成。之后会将我们需要用到的东西全部放在D:\software\opencv-4.4.0\build_vs2019\install文件夹下,包括以下内容:
(1) include,头文件
(2)x64/vc16/bin,dll文件
(3)x64/vc16/lib,lib文件 - install文件夹下所有的东西在其他地方都存在,比如dll文件在D:\software\opencv-4.4.0\build_vs2019\bin\Release,lib文件在D:\software\opencv-4.4.0\build_vs2019\lib\Release,但是头文件比较零散。INSTALL项目只是将这些我们调用OpenCV时需要用到的所有文件统一拷贝到了一个地方,省得自己找来找去。
直接将工程拷贝给别人使用
- 将opencv文件拷贝到VS工程文件夹下。这样将后续配置路径成相对路径,那么当把工程文件拷贝给别人后,别人不需要额外配置就可以直接打开运行;
- 如果把所有的dll lib 头文件都放在一个地方,每次使用绝对路径进行后续配置,那么拷给被人后就会很麻烦
成功进入源码
其它问题
并行库和动态库没有安装!具体有:ONETBB TBB OPENMP
- 你编译的时候勾选了tbb之类的库吧,但是你没有安装这些库,导致找不到这些dll
- 要么去掉这些库,要么安装这些库,安装方法百度下就有
- opencv cmake编译添加TBB、ipp、openmp和扩展 opencv_contrib_l12212的博客-CSDN博客
下载TBB,添加了TBB路径;勾选了with_openmp, with_ipp;然后重新configure,重新生成INSTALL工程;
[ INFO:0@4.497] global registry_parallel.impl.hpp:96 cv::parallel::ParallelBackendRegistry::ParallelBackendRegistry core(parallel): Enabled backends(3, sorted by priority): ONETBB(1000); TBB(990); OPENMP(980)
[ INFO:0@4.497] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load H:\opencv_code\OpencvTest\opencv\bin\opencv_core_parallel_onetbb470_64d.dll => FAILED
[ INFO:0@4.497] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_onetbb470_64d.dll => FAILED
[ INFO:0@4.498] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load H:\opencv_code\OpencvTest\opencv\bin\opencv_core_parallel_tbb470_64d.dll => FAILED
[ INFO:0@4.498] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_tbb470_64d.dll => FAILED
[ INFO:0@4.498] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load H:\opencv_code\OpencvTest\opencv\bin\opencv_core_parallel_openmp470_64d.dll => FAILED
[ INFO:0@4.499] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_openmp470_64d.dll => FAILED
https://ask.csdn.net/questions/7609851
检查OpenCV是否使用TBB库编译_opencv tbb_TracelessLe的博客-CSDN博客
- TBB是为了多核处理器软件开发的C++模板库;作用是opencv在任务处理中使用多线程加速。
- 注意拷贝tbb12_debug.dll库的时候,拷贝64位的就可以了。(我拷贝成了32位的,一度bug)