Windows编译Opencv4.8.1 CUDA12.1 支持Python Java Windows环境下使用CMAKE命令编译CUDA版OpenCV4.8.1,支持Python、Java
Windows编译Opencv4.8.1 CUDA12.1 支持Python Java
版本说明
cmake version 3.28.1
opencv 4.8.1
opencv-contrib 4.8.1
cuda 12.1.1
cudnn 8.9.7, 重要:cudnn不要使用9以上的版本,否则使用visual studio点击生成时会报错,报错的方法名字是CUDA4DNN_CHECK_CUDNN,提示:
…\cudnn/recurrent.hpp(122): error C3861: ‘cudnnSetRNNDescriptor_v6’: identifier not found,具体issue的说明可从github查看。
猜测这个问题会导致一些opencv_***.lib无法生成,被这个问题坑了1个月,泪目…
Video_Codec_SDK_12.0.16:解压缩,把Interface下的所有文件复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\include下,把Lib目录下的所有文件夹复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\lib下。
其他软件说明:
visual studio 2019:这里建议2019版,官网2022社区版从17.10开始MSVC_VERSION为1940,cuda 12.1.1恰好不支持1940,在编译时会报错
miniconda3 python3.11.5:Miniconda3-py311_23.10.0-1-Windows-x86_64,请提前安装好numpy(1.26.4)和matplotlib(3.7.5)
JDK 1.8.0_211
Ant 1.10.2(必须)
CMake编译OpenCV4.8.1
不要通过gui来编译opencv,各种问题不断,直接使用CMAKE命令来编译。
在OpenCV的SOURCE下新建build文件夹,在build文件夹下执行下面的命令。
CMAKE命令:亲测一次编译成功!
cmake -G "Visual Studio 16 2019" -A x64 -D WITH_CUDA=ON -D WITH_CUDNN=ON -D WITH_CUBLAS=ON -D OPENCV_DNN_CUDA=ON -D CUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1" -D CUDNN_VERSION='8.9.7' -D CUDNN_INCLUDE_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/include" -D CUDNN_LIBRARY="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/lib/x64/cudnn.lib" -D CUDA_cublas_LIBRARY="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/lib/x64/cublas.lib" -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_ARCH_BIN='8.9' -D CUDA_ARCH_PTX='' -D PYTHON_DEFAULT_EXECUTABLE="D:/Develop/Python/miniconda3/envs/moon-python/python.exe" -D PYTHON3_EXECUTABLE="D:/Develop/Python/miniconda3/envs/moon-python/python.exe" -D PYTHON3_INCLUDE_DIR="D:/Develop/Python/miniconda3/envs/moon-python/include" -D PYTHON3_LIBRARY="D:/Develop/Python/miniconda3/envs/moon-python/libs/python311.lib" -D PYTHON3_NUMPY_INCLUDE_DIRS="D:/Develop/Python/miniconda3/envs/moon-python/Lib/site-packages/numpy/core/include" -D PYTHON3_PACKAGES_PATH="D:/Develop/Python/miniconda3/envs/moon-python/Lib/site-packages" -D OPENCV_EXTRA_MODULES_PATH="D:/Develop/Python/opencv/opencv_contrib-4.8.1/modules" -D WITH_GSTREAMER=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=ON -D WITH_OPENGL=ON -D WITH_FFMPEG=ON -D BUILD_SHARED_LIBS=OFF -D BUILD_opencv_java=ON -D WITH_JAVA=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX="D:/Develop/Python/opencv/opencv-4.8.1/sources/build/install" \.\.
注意:
1.最后的..不可省略,表示源码路径;
2.把相关的路径替换成自己的路径,比如PYTHON相关路径、CUDA_TOOLKIT_ROOT_DIR、OPENCV_EXTRA_MODULES_PATH、CMAKE_INSTALL_PREFIX;
3.CUDA_ARCH_BIN根据自己电脑的算力填写,4060对应的是8.9;
4.添加-D BUILD_SHARED_LIBS=OFF,这样生成的opencv_java481.dll可单独使用;
5.如果用了BUILD_opencv_world=ON,那么BUILD_opencv_java是不会生效的,想要opencv_world,可以把这个参数加上,清空build,重新走一遍Cmake流程
为方便查看命令,在此按参数将每行分开
cmake -G "Visual Studio 16 2019" \
-A x64 \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D WITH_CUBLAS=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1" \
-D CUDNN_VERSION='8.9.7' \
-D CUDNN_INCLUDE_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/include" \
-D CUDNN_LIBRARY="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/lib/x64/cudnn.lib" \
-D CUDA_cublas_LIBRARY="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/lib/x64/cublas.lib" \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D CUDA_ARCH_BIN='8.9' \
-D CUDA_ARCH_PTX='' \
-D PYTHON_DEFAULT_EXECUTABLE="D:/Develop/Python/miniconda3/envs/moon-python/python.exe" \
-D PYTHON3_EXECUTABLE="D:/Develop/Python/miniconda3/envs/moon-python/python.exe" \
-D PYTHON3_INCLUDE_DIR="D:/Develop/Python/miniconda3/envs/moon-python/include" \
-D PYTHON3_LIBRARY="D:/Develop/Python/miniconda3/envs/moon-python/libs/python311.lib" \
-D PYTHON3_NUMPY_INCLUDE_DIRS="D:/Develop/Python/miniconda3/envs/moon-python/Lib/site-packages/numpy/core/include" \
-D PYTHON3_PACKAGES_PATH="D:/Develop/Python/miniconda3/envs/moon-python/Lib/site-packages" \
-D OPENCV_EXTRA_MODULES_PATH="D:/Develop/Python/opencv/opencv_contrib-4.8.1/modules" \
-D WITH_GSTREAMER=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_OPENGL=ON \
-D WITH_FFMPEG=ON \
-D BUILD_SHARED_LIBS=OFF \
-D BUILD_opencv_java=ON \
-D WITH_JAVA=ON \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX="D:/Develop/Python/opencv/opencv-4.8.1/sources/build/install" \
..
1.编译成功后,用Visual Studio2019打开Build目录下的OpenCV.sln,等待就绪后,右侧bindings下有opencv_java、opencv_python3,选择RELEASE;
2.右键ALL_BUILD点击“生成”,时间比较久30-1小时不等
3.全部成功后,右键INSTALL,点击“生成”,稍等片刻即可完成。
在CMAKE编译时指定的路径下可以看到cv2安装成功,D:\Develop\Python\miniconda3\envs\moon-python\Lib\site-packages\cv2
import cv2
# 检查是否支持 CUDA
if cv2.cuda.getCudaEnabledDeviceCount() > 0:
print("CUDA support is available.")
else:
print("CUDA support is not available.")
exit()
输出CUDA support is available
4.Java查看安装目录下的java文件夹,存在opencv-481.jar、opencv_java481.dll两个文件,即成功!!!这里的opencv_java481.dll之所有只有2861kb,因为没有加-D BUILD_SHARED_LIBS=OFF的缘故…D:\Develop\Python\opencv\opencv-4.8.1\sources\build\install\java
实践证明,CUDA版的OpenCV确实会快一些!
补充 OpenCV 4.10.0
后续下载了opencv 4.10.0,如果只需要opencv-python的话,把对应的java参数去掉,按上面的操作一步步执行即可成功。
如果需要java,执行Cmake命令之后,用VS2019中打开源码,修改gen_opencv_java_source下的gen_java.py,第105、576、580行指定按utf-8编码读取文件,如下图所示, encoding=‘utf-8’,修改后在执行INSTALL。
opencv_java如下图所示,Cmake时添加了-D BUILD_SHARED_LIBS=OFF,可以看到dll文件大了很多,可以单独使用了。
最后看下一cv2是否成功使用了GPU~
import cv2 as cv
import os
def check_cuda_support():
print("OpenCV version: {}".format(cv.__version__))
print("CUDA support available: {}".format(cv.cuda.getCudaEnabledDeviceCount() > 0))
2024-09-23补充
Visual Studio 2022 (17.10.1)
各软件版本号:
Visual Studio 2022(17.10.1),并不是所有的vs2022都适用,这里用的是17.10.1
cmake version 3.28.1
opencv 4.10.0
opencv-contrib 4.10.0
cuda 12.5.1
cudnn 9.2.1, 这里可以使用9以上的版本了
miniconda3 python3.11.5:Miniconda3-py311_23.10.0-1-Windows-x86_64,请提前安装好numpy(1.26.4)和matplotlib(3.7.5)
Video_Codec_SDK_12.1.14
推荐WSL2
windows下使用VS编译OpenCV坑过多,推荐直接在wsl2安装使用opencv方式,就不需要Visual Studio了,同时利用make -j20多线程编译(20表示的是CPU核数)可以节省大量时间,其他操作与windows基本一致。