opencv4编译
1. 下载opencv、opencv_contrib、cuda、cudnn
opencv
opencv_contrib
cuda
cudnn (可选)
2. 编译脚本
在opencv根目录中创建文件build.sh
#!/bin/env bash
mkdir -p build
cd build
cmake -DOPENCV_EXTRA_MODULES_PATH:PATH="D:/libs/opencv_linux/opencv_contrib/modules" -DCUDNN_LIBRARY="D:/libs/cuda/lib/x64" -DCUDNN_INCLUDE_DIR="D:/libs/cuda/include" -DOPENCV_DNN_CUDA:BOOL="1" -DWITH_NVCUVID:BOOL="1" -DBUILD_JAVA:BOOL="0" -DBUILD_PERF_TESTS:BOOL="0" -DBUILD_opencv_python_bindings_generator:BOOL="0" -DBUILD_opencv_python_tests:BOOL="0" -DWITH_CUDA:BOOL="1" -DBUILD_opencv_world:BOOL="1" -DBUILD_TESTS:BOOL="0" -D OPENCV_GENERATE_PKGCONFIG=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=RELEASE ..
make -j
make install
cmake执行完后的正确打印信息最后几行如下
-- NVIDIA CUDA: YES (ver 11.1, CUFFT CUBLAS NVCUVID)
-- NVIDIA GPU arch: 35 37 50 52 60 61 70 75 80 86
-- NVIDIA PTX archs:
--
-- cuDNN: YES (ver 8.0.4)
--
-- OpenCL: YES (NVD3D11)
-- Include path: D:/libs/opencv_linux/3rdparty/include/opencl/1.2
-- Link libraries: Dynamic load
--
-- Python (for build): C:/Users/xshen/AppData/Local/Programs/Python/Python39/python.exe
--
-- Install to: D:/libs/opencv_linux/build/install
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: D:/libs/opencv_linux/build
linux
直接运行脚本;
windows
需要安装Visual Studio和cmake,自行创建build目录,build目录内cmd中执行cmake一行,然后打开生成的OpenCV.sln编译
说明
- 脚本中的路径替换成自己的目录。
- 编译好的动态库生成在
build/install
目录 - cmake命令执行时需观察有没有报错误,自行搜索错误的解决办法
- 经常会碰到下载失败的情况,打开
build/CMakeDownloadLog.txt
文件复制下载路径(如:https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_intel64_20191018_general.zip
)到浏览器中下载
3. GPU解码
example:
#include <iostream>
#include <opencv2/opencv_modules.hpp>
#include <opencv2/cudacodec.hpp>
int main(char argc, char** argv)
{
cv::cuda::GpuMat img;
cv::Ptr<cv::cudacodec::VideoReader> cap;
try {
cap = cv::cudacodec::createVideoReader(argv[1]);
int index = 0;
while (cap->nextFrame(img))
{
std::cout << index++ << std::endl;
}
} catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
}