The CMake GUI is overrated. Here’s the terminal command I’m now using to quickly configure and generate a python solution for OpenCV:

cmake ^
  -S "C:/Users/Username/Desktop/Projects/Mine/OpenCV_GPU/opencv-4.11.0" ^
  -B "C:/Users/Username/Desktop/Projects/Mine/OpenCV_GPU/build" ^
  -G "Visual Studio 17 2022" -A x64 ^
  -DBUILD_JAVA=OFF ^
  -DBUILD_opencv_python3=ON ^
  -DPYTHON3_EXECUTABLE="C:/Users/Username/miniconda3/envs/opencv310/python.exe" ^
  -DPYTHON3_INCLUDE_DIR="C:/Users/Username/miniconda3/envs/opencv310/include" ^
  -DPYTHON3_LIBRARY="C:/Users/Username/miniconda3/envs/opencv310/libs/python310.lib" ^
  -DPYTHON3_NUMPY_INCLUDE_DIRS="C:/Users/Username/miniconda3/envs/opencv310/Lib/site-packages/numpy/_core/include" ^
  -DPYTHON3_PACKAGES_PATH="C:/Users/Username/miniconda3/envs/opencv310/Lib/site-packages" ^
  -DEIGEN_INCLUDE_PATH="C:/cygwin64/usr/include/eigen3/Eigen/src/Core/util" ^
  -DEigen3_DIR="C:/cygwin64/usr/share/eigen3/cmake" ^
  -DWITH_CUDA=ON ^
  -DOPENCV_DNN_CUDA=ON ^
  -DCUDA_ARCH_BIN=8.9 ^
  -DCUDA_ARCH_PTX=9.0 ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DOPENCV_EXTRA_MODULES_PATH="C:/Users/Username/Desktop/Projects/Mine/OpenCV_GPU/opencv_contrib-4.11.0/modules" ^
  -DWITH_GSTREAMER=OFF ^
  -DWITH_CUDNN=ON ^
  -DCUDNN_LIBRARY="C:/Program Files/NVIDIA Corporation/NVIDIA GPU Computing Toolkit/CUDA/v12.8/lib/x64/cudnn.lib" ^
  -DCUDNN_INCLUDE_DIR="C:/Program Files/NVIDIA Corporation/NVIDIA GPU Computing Toolkit/CUDA/v12.8/include" ^
  -DWITH_LAPACK=OFF ^
  -DCUDA_nvcuvid_LIBRARY="C:/Program Files/NVIDIA Corporation/NVIDIA GPU Computing Toolkit/CUDA/v12.8/lib/x64/nvcuvid.lib" ^
  -DCUDA_nvencodeapi_LIBRARY="C:/Program Files/NVIDIA Corporation/NVIDIA GPU Computing Toolkit/CUDA/v12.8/lib/x64/nvencodeapi.lib" ^
  -DCUDA_cublas_LIBRARY_ABS="C:/Program Files/NVIDIA Corporation/NVIDIA GPU Computing Toolkit/CUDA/v12.8/lib/x64/cublas.lib" ^
  -DOpenBLAS_INCLUDE_DIR="C:/Users/Username/Desktop/Projects/Mine/OpenCV_GPU/OpenBLAS-0.3.29_x86/include" ^
  -DOpenBLAS_LIB="C:/Users/Username/Desktop/Projects/Mine/OpenCV_GPU/OpenBLAS-0.3.29_x86/lib/libopenblas.lib" ^
  -DENABLE_FAST_MATH=ON ^
  -DBUILD_SHARED_LIBS=OFF ^
  -DBUILD_TESTS=OFF ^
  -DBUILD_PERF_TESTS=OFF ^
  -DBUILD_EXAMPLES=OFF ^
  -DWITH_OPENEXR=OFF ^
  -DWITH_TESSERACT=OFF

Hopefully this works. I’m thinking the advantage to this method is that I define my Python package to use on initial configuration. In the GUI, I’d been setting my Python location (as well as all those other flags) after the initial config.


It worked!

But I quickly found out that actually running the package in Python took more configuration. Here’s what I had to do…

  1. Add the generated .pyd file in build\lib\python3\ to my conda environment’s Lib\site-packages\ directory.

Then, in my Python script, in order to properly import the library, I need to manually link the /bin directory of the CUDA toolkit (12.8) I used to build OpenCV.

import os
os.add_dll_directory("C:/Program Files/NVIDIA Corporation/NVIDIA GPU Computing Toolkit/CUDA/v12.8/bin")
import cv2

That directory is already in my path, but for some reason it doesn’t get recognized, possibly because I have three different CUDA toolkits installed.

This was one of those tasks I got way too invested in for minimal (rather, unknown) returns, but I’m glad I finally got it sorted. Now, on to bigger things.


Tags: cmake opencv python cuda gpu build