lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
Windows+CLion+OpenCV环境
2022-09-05 15:26:49
73
0
0
lee-romantic
由于CLion基于CMake构建项目,需要重新编译OpenCV源码。 # 建议 网上很多人编译过程会出现很多错误,我这里使用"科学上网",全程很顺利,建议科学上网! # 过程 ## 准备工作 - 蒸汽大脑(jetbrains)教育账号: - yangping@stu.scu.edu.cn - scu614b. - 准备OpenCV源码,官网下载即可。 - 安装CLion,需要破解或者使用教育邮箱。 - 安装mingw,下载支持C++11多线程的posix版本,参考文末链接。 安装完后,设置CLion的工具链。 - 安装CMake,需要安装cmake.gui ## 普通版本编译 - 在OpenCV目录下新建mingw的build目录minGW-build,用来保存make生成的一系列文件 - 打开cmake.gui图形化操作界面,选择opencv源码目录和新建的minGW-build目录,然后选择tools菜单,点击configure。这过程可能会出问题,所以建议科学上网! - configure结束之后,开始generate,生成makefile文件。 - 如果一切顺利的话,进入到mingw_build目录下(-j4代表使用四个线程加速编译) ``` mingw32-make -j4 ``` - 结束后,运行: ``` mingw32-make install ``` - 最后,将`{opencv_homedir}/opencv/MinGW-build/install/x64/mingw/bin`加入环境变量中的path中。 - 测试程序: - main.cpp ``` #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; int main() { cv::Mat img = imread("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\20170329112146_5CR4n.jpeg"); if (img.empty()) { cout << "Error" << endl; return -1; } namedWindow("pic", WINDOW_FULLSCREEN); imshow("pic", img); waitKey(); } ``` - CMakeLists.txt ``` cmake_minimum_required(VERSION 3.21) project(test) set(CMAKE_CXX_STANDARD 11) # OpenCV related set(OpenCV_DIR D:\\OpenCV\\opencv4.5.4\\opencv\\minGW-build\\install) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(test main.cpp) target_link_libraries(test ${OpenCV_LIBS}) ``` # 出现的错误 ## 1、配好环境后,运行出现下面错误: ``` Process finished with exit code -1073741515 (0xC0000135) ``` - 情况一 - 可能配置没生效,重启CLion后就好了。 - 情况二 - 容易查到,0xc0000135错误表示应用程序未能找到程序正常运行所需的DLL文件,因此程序无法启动。 - 但是在clion中,也看不出出错时到底是缺少哪些dll。这时候,可以直接点击生成的exe可执行文件,这时候就会弹出“找不到....dll”的错误了。 - 这里根据弹出的错误,发现很多opencv的dll都找不到。从而定位到,项目依赖的opencv(尽管使用的是相对路径依赖)不在环境变量中,因此配置好依赖的opencv环境变量后,问题解决。 ## 2、使用CLion编译项目是正确的,但是使用cmake命令行就出现问题: - 这应该是CLion中cmake参数与命令行是不一样的。 CLion中要么是MinGW,要么是Cygwin,而windows平台默认cmake的生成器是msvc,即Windows CMake uses the newest Visual Studio installation作为默认生成器,除非调用CMake时显式指定生成器(`cmake -G "MinGW Makefiles" .`)。 这种行为是硬编码的,不能改变。作为一种变通,你可以使用名为cmake.bat具有以下内容一批包装脚本: ``` @cmake.exe -G "MinGW Makefiles" %* ``` 脚本应放置在一个目录上的系统路径,应该优先于CMake的可执行文件cmake.exe。 该脚本使用MinGW作为生成器调用cmake.exe,并将所有其他参数转发给它。 [参考链接](http://cn.voidcc.com/question/p-gwomilpv-ww.html) 生成makefile了之后,使用make生成可执行文件。 (我们这里使用`mingw32-make`,对应着`D:\mingw64\bin`路径下的`mingw32-make.exe`,因此可以将mingw32-make重命名为make.exe,这样就可以使用make命令了。) - 2022/08/26更新 - 重新再新建一个文件夹后,cd进入后,使用`cmake -G "MinGW Makefiles" ..`编译会出现如下错误。 - 其实错误已经说明了原因了,就是之前使用了其它生成器,更换生成器后,没把之前产生的相关文件删除。 - 把原先由cmake指令产生的临时文件都删了; - 更换另一个目录,重新执行cmake指令即可。 - 参考[链接](https://blog.csdn.net/u014140383/article/details/103864446) ``` CMake Error: Error: generator : MinGW Makefiles Does not match the generator used previously: Visual Studio 17 2022 Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory. ``` ## 3、在编译目录build下make出现找不到文件的错误  这是因为路径出现了中文"新建文件夹",所以要尽可能避免中文! ## 4、CMAke构建时出现了下面错误:  是因为cmake构建时,没有指定`-DCMAKE_CONFIGURATION_TYPES=Debug`或者`-DCMAKE_CONFIGURATION_TYPES=Release` - 参考链接: - https://www.cnblogs.com/ericling/p/15586751.html - https://blog.csdn.net/CPZ742954007/article/details/112556745 ## Windows CUDA版本编译 ### 1、准备 - 需要提前准备cuda以及cudann,另外同样需要CMake以及visual studio, 至于MinGW,应该是不需要的。 因为OpenCV在windows平台上要想编译CUDA版本,只能使用visual studio,如果要使用CUDA版本的OpenCV,要么换Visual Studio,要么换平台(Ubuntu)。[参考出处](https://zhuanlan.zhihu.com/p/107887128)。 - 这里仍然是编译`opencv454`版本,这里还额外需要`opencv-contrib`源码。 - opencv[源码下载](https://github.com/opencv/opencv/releases) 和 opencv-contrib[源码下载](https://github.com/opencv/opencv_contrib/tags) - 下载完并解压之后放在同一目录下(比如D:\libo20220507\OpenCV) ## 2、CUDA编译 - 首先: 新建一个`opencv454_cuda_build`文件夹,用于存放编译产物。 - 第一步: - 打开CMake,设置好opencv源码目录路径以及build产物路径(`opencv454_cuda_build`),注意源代码路径需要指向真实的OpenCV的source目录。 - 设置完之后,点击configure时第一次运行,参数选择如下:visual studio ,x64 以及 use default native compilers。 - 如果成功运行了configure之后,继续完成下面的设置:搜索cuda关键字,勾选所有cuda相关的选项。 - 勾选BUILD_opencv_world选项 - 第二步: - 设置扩展模块路径,搜索并找到`OPENCV_EXTRA_MODULES_PATH`变量,将其值设置为`opencv-contrib`中modules的路径,比如`D:/opencv_contrib-4.5.4/modules`. - 还可以把java和python相关选项关闭,根据自己的情况设置, 保证勾选cuda相关选项即可,最后再次点击configure,(科学上网的情况下,应该不会出特别大的错,即使有部分github issue的文件下载不下来,也不是网络的问题,应该不影响),最后点击generate。 - 最后点击“Open Project”打开工程,在Release模式下右键点击`ALL_BUILD`,生成,时间较长。 - 生成之后,`右击INSTALL->仅用于项目->仅生成INSTALL` (我使用了debug模式,貌似build时间更长了! 注意:使用debug/Release模式,会生成对应的opencv代码库,比如debug的opencv库,就不支持在opencv中设置release。要切换的话,需要同时在cmake中选择对应debug/Release模式的opencv库)  - 编译完成后,在CMakeLists.txt中配置OpenCV: ``` set(OpenCV_DIR D://libo20220507//OpenCV//opencv4.5.4//opencv454_cuda_build//install) #set(OpenCV_DIR ${PROJECT_SOURCE_DIR}/third_party/opencv4.5.4/minGW-build/install) # 基于MinGW生成的就没有问题 find_package(OpenCV 4.5.4 REQUIRED) include_directories( ${OpenCV_INCLUDE_DIRS} include) ``` - 第三步: 修改代码,以启动cuda加速: ``` this->net = cv::dnn::readNetFromONNX(onnxpath); // 去掉则仅仅使用cpu进行推理 this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA); this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA); ``` - 这里使用msvc编译器生成的opencv库,由于msvc和mingw不兼容,导致我们只能生成vs项目。 - 直接使用`cmake ..`生成VS项目,不指定平台类型,可能会报错找到OpenCV配置文件,但是OpenCV_FOUND设为False,如下: ``` CMake Warning at E:/Dev/DevPackages/opencv/v4.2.0/install_opencv4.2.0_vs2017_debug/OpenCVConfig.cmake:176 (message): Found OpenCV Windows Pack but it has no binaries compatible with your configuration. You should manually point CMake variable OpenCV_DIR to your build of OpenCV library. Call Stack (most recent call first): CMakeLists.txt:14 (find_package) CMake Error at CMakeLists.txt:14 (find_package): Found package configuration file: XXX/v4.2.0/install_opencv4.2.0_vs2017_debug/OpenCVConfig.cmake but it set OpenCV_FOUND to FALSE so package "OpenCV" is considered to be NOT FOUND. ``` - 原因可能是默认生成器不是msvc了,此时可以通过`-G`参数指定msvc生成器(详细介绍参考命令`cmake -G -h`, 或者[-G参数参考](https://www.cnblogs.com/xikeguanyu/p/14045620.html)) ,另外[-D参数参考](https://blog.csdn.net/weixin_39766005/article/details/122439200): ``` cmake .. -DCMAKE_CONFIGURATION_TYPES=Debug -G "Visual Studio 16 2019" //或者-D可以分开: cmake .. -D CMAKE_CONFIGURATION_TYPES=Debug -G "Visual Studio 16 2019" //或者-D分开且设置CMAKE_BUILD_TYPE: cmake .. -D CMAKE_BUILD_TYPE=Debug -G "Visual Studio 16 2019" ``` - 之后,可以看到生成产物包含sln文件,双击sln文件打开vs项目。 (或者使用MSBuild命令行生成可执行文件:`E:\_install\"visual studio 2019"\Community\MSBuild\Current\Bin\MSBuild.exe .\MultipleObjectTracking.sln`) - 项目第一次可能需要配置opencv: - 首先,[参考链接](https://blog.csdn.net/qq_23149979/article/details/107244405),添加环境变量Path: ``` D:\libo20220507\OpenCV\opencv4.5.4\opencv454_cuda_build\install\x64\vc16\bin ``` - 然后,项目-属性-C/C++目录-包含目录: ``` D:\libo20220507\OpenCV\opencv4.5.4\opencv454_cuda_build\install\include D:\libo20220507\OpenCV\opencv4.5.4\opencv454_cuda_build\install\include\opencv2 ``` - 项目-属性-C/C++目录-库目录 ``` D:\libo20220507\OpenCV\opencv4.5.4\opencv454_cuda_build\install\x64\vc16\lib ``` - 添加附加依赖项,`opencv_world454d.lib`。 - 可能出现找不到opencv_world454.dll的问题,拷贝opencv_world430d.dll到“C:\Windows\System32”下即可。 设置完成后,右键点击ALL-BUILD重新生成,直接双击生成的exe可以运行,并且是已经加速了的。 如果点击,这里可能出现:"`无法启动程序,D:\libo20220507\MultiObjectTracking_bytetrack\cmake_build\x64\Debug\ALL_BUILD, 系统找不到指定的文件`", 这个拒绝访问的问题,可以看出系统去启动ALL_BUILD去了,点击整体项目属性,调整下启动项目,让其去启动MultiObjectTracking而不是ALL_BUILD即可,问题解决。 - 参考链接 https://blog.csdn.net/qq_23149979/article/details/107244405 https://zhuanlan.zhihu.com/p/107887128 https://www.freesion.com/article/79041144929/ https://blog.csdn.net/qq_37447786/article/details/124750500
上一篇:
激光点云PCL库开发环境搭建
下一篇:
Ubuntu打开usb摄像头出现的问题
0
赞
73 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册