1 环境准备
1 vs2019
2 anaconda+Python3.6+numpy
3 cuda和cudnn环境
4 cmake
5 OpenCV4.5.0以及OpenCV-contrib4.5.0压缩包
本人电脑里的cuda和cudnn环境如下:
当然Python环境可以不用anaconda,自己去下载Python3.6安装,然后装上numpy模块,因为Python版本的OpenCV依赖于numpy。如果用户仅仅需要编译C++版本的OpenCV,可以去掉Python环境。
2 cmake编译
将下载的OpenCV两个压缩包解压
进入OpenCV4.5.0目录下,新建一个文件夹build,作为cmake编译文件存放目录。
打开cmake,目录选择如下:
然后点击configure
点击完成
等待configure完成,在这个界面中进行如下更改:
将build_java勾选取消、build_tests勾选取消、with vtk勾选取消
勾选上这个OPENCV_ENABLE_NONFREE
勾选BUILD_opencv_world
然后添加contrib的目录:
以上几个选项就是C++编译环境的设置,如果用户不需要编译Python版本,就可以到这一步。
接下来设置Python版本OpenCV的生成
对于cmake界面中有些选项如果没有的话,需要手动添加Add Entry
新建BUILD_opencv_python3以及BUILD_opencv_python2
一个为true一个为false
然后根据自己的anaconda中Python和numpy的路径来进行如下配置:
python.exe所在路径:
PYTHON3_EXECUTABLE=G:/install/conda/envs/python368/python.exe
头文件目录:
PYTHON3_INCLUDE_DIR=G:/install/conda/envs/python368/include
Python的lib文件路径:
PYTHON3_LIBRARY=G:/install/conda/envs/python368/libs/python36.lib
numpy模块中头文件目录:
PYTHON3_NUMPY_INCLUDE_DIRS=G:/install/conda/envs/python368/Lib/site-packages/numpy/core/include
Python第三方模块所在目录:
PYTHON3_PACKAGES_PATH=G:/install/conda/envs/python368/Lib/site-packages
到这一步Python的环境就配置好了,接下来配置GPU环境:
勾选上WITH_CUDA
由于没有WITH_CUDNN,因此就手动添加
然后点击configure
这一次configure 完成后
上面还有一些红色选项需要我们再次确认,因此接着再点击一次configure
这一次完成后所有选项全部变白了
然后我们点击生成generate
等待生成完成
vs2019编译
在点击generate生成完成后,我们使用vs2019打开这个工程
由于本人需要的是release版本的,因此将debug改为release
打开了工程后我们先不要急于生成,先单独运行这两个工程看看是否会成功
在我的电脑里运行时提示这个错误:unsupported Microsoft Visual Studio version!
这个是cuda的头文件不支持vs2019这么高的版本,我们打开提示错误的这个host_config.h文件,找到这个地方
因为1920对应的就是vs2017,vs2019的数字大于这个,所有就报错,解决办法是把这个1920改大些,这里我改成2000
接下来可以右键ALL_BUILD->生成
生成成功然后就可以右键Install 生成动态库和头文件
至此GPU版本的OpenCV编译完成。
那么这个Python版本的OpenCV是否已经安装了,实际上在点击install进行生成的时候,就已经把Python版本的OpenCV模块安装到Python环境中去了。
不过通过这种方式安装的Python版OpenCV通过pip list却无法显示出来,因为这个命令只能显示通过pip安装的模块,但是却是可以使用的。
OpenCV4.5的C++GPU库编译好了,接下来在vs2019中调用测试下看GPU库是否可以使用:
C++测试代码如下:
#include <iostream>
#include<opencv2/opencv.hpp>
int main(int argc, char* argv[])
{
cv::cuda::GpuMat img(400, 600, CV_8UC3, cv::Scalar(255, 0, 0));
cv::Mat cpuImg;
img.download(cpuImg);
cv::imshow("test", cpuImg);
cv::waitKey(0);
return 0;
}
运行成功,代表OpenCV环境编译正确。