Windows编译Opencv4.8.1 CUDA12.1 支持Python Java

Windows编译Opencv4.8.1 CUDA12.1 支持Python Java

  • 版本说明
  • CMake编译OpenCV4.8.1
  • 补充 OpenCV 4.10.0
  • 2024-09-23补充
  • Visual Studio 2022 (17.10.1)
  • 推荐WSL2
  • 版本说明

    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小时不等A

    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基本一致。

    作者:DawnFlying

    物联沃分享整理
    物联沃-IOTWORD物联网 » Windows编译Opencv4.8.1 CUDA12.1 支持Python Java

    发表回复