目录
前言
竞赛中除了使用深度学习这样的万金油以外,掌握基础图像处理和简单检测也是必不可少的。opencv作为免费且开源的软件,在实际使用中非常广泛,我一般给学弟学妹们要求大家自己下去学习,也就是我不单独教如何使用opencv,默认你是会的。那么像简单的颜色检测、图像增强、巡线检测之类的任务凭借opencv就可以轻松完成,当然常见的图像处理工具还有Pillow等,相信大家会自己下去研究的。opencv的安装难点主要在于cmake配置的多少以及受限下载文件,这里都会给大家讲到。
一、OpenCV是什么?
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由英特尔公司发起并参与开发,现在由 Willow Garage 公司维护。它包含了数百种计算机视觉算法,广泛应用于图像处理、视频分析、物体识别、机器学习等领域。
opencv支持 Windows、Linux、macOS、Android 和 iOS。
借助opencv我们可以实现图像处理、视频分析、特征检测、目标跟踪、机器学习等等并且可以通过编译扩展实现GPU加速处理。可以说,仅仅通过opencv就可以实现竞赛中大部分视觉任务。opencv学习可以锻炼我们解决图像问题的能力,因此对于新手来说,学习opencv花的时间应该要比学习深度学习花的时间要多。
想要了解更多相关知识请看官网https://opencv.org/
二、源码编译Opencv
1.系统环境
-
操作系统:Ubuntu 20.04 LTS(64位,需更新到最新补丁)
-
GPU:NVIDIA GeForce RTX 3060
-
CUDA:12.4
-
cudnn:9.9
-
内存:≥16GB(编译过程消耗较大)
-
磁盘空间:≥20GB(源码+编译产物)
2.基础依赖安装
安装编译所需的工具链和图像/视频/信号 IO 全量依赖(超级全的依赖,大家也可以不安装这么多)
命令安装
sudo apt install -y \
build-essential \
pkg-config \
libgtk-3-dev \
libgtk2.0-dev \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
libavresample-dev \
libswscale-dev \
libv4l-dev \
libxvidcore-dev \
libx264-dev \
libjpeg-dev \
libjpeg8-dev \
libpng-dev \
libtiff-dev \
libwebp-dev \
libopenexr-dev \
libgdal-dev \
libxine2-dev \
libdc1394-22-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libtbb-dev \
libtbb2 \
libatlas-base-dev \
liblapacke-dev \
libopenblas-dev \
libfaac-dev \
libmp3lame-dev \
libtheora-dev \
libvorbis-dev \
libopencore-amrnb-dev \
libopencore-amrwb-dev \
x264 \
v4l-utils \
libgphoto2-dev \
libeigen3-dev \
libgflags-dev \
libgoogle-glog-dev \
libhdf5-dev \
libutf8proc-dev \
libssl-dev \
libtesseract-dev \
tesseract-ocr \
doxygen \
libvtk6-dev \
libxine2-dev \
python3-dev \
python3-numpy \
gfortran \
libgstreamer-plugins-bad1.0-dev \
libgstreamer-plugins-good1.0-dev
3.下载源码
创建编译目录并下载OpenCV 4.8.0及Contrib模块(Contrib包含额外功能如SIFT、CUDA加速):
# 创建编译文件夹
mkdir ~/opencv && cd ~/opencv
# 下载OpenCV 4.8.0源码
wget -O opencv.zip https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip
# 下载Contrib模块(必须对应4.8.0版本)
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.8.0.zip
# 解压并重命名(方便路径引用)
unzip opencv.zip && unzip opencv_contrib.zip
mv opencv-4.8.0 opencv && mv opencv_contrib-4.8.0 opencv_contrib
别忘了使用之前的加速技巧哦~


4.安装CUDA视频编解码模块(可选)
点击官网链接https://developer.nvidia.com/video-codec-sdk

agree后点击download


这里仍然需要我们登录验证

下载解压后
sudo cp -a Interface/* /usr/local/cuda/include/
sudo cp -a Lib/linux/* /usr/local/cuda/lib64/
sudo ldconfig
再安装头文件
5.配置CMake(核心步骤)
进入OpenCV源码的build目录,执行CMake配置(参数需根据自身硬件调整):
显卡的计算能力可以在nvidia公司这个页面查看
https://developer.nvidia.cn/cuda-gpus
cd ~/opencv/opencv
mkdir build #使用cmakee编译c/c++语言时我们习惯新建一个build环境并在其中编译,但是这个名称不强制规定大家可以根据自己喜欢的慢名称来。我们还是尊重传统
cd build
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_CUDA=ON \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-D CUDA_ARCH_BIN=8.6 \
-D CUDA_ARCH_PTX="" \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_CUDNN=ON \
-D BUILD_opencv_cudacodec=OFF \
-D WITH_CUBLAS=ON \
-D WITH_CUFFT=ON \
-D WITH_NVCUVID=ON \
-D WITH_OPENGL=ON \
-D WITH_GTK=ON \
-D WITH_QT=ON \
-D WITH_VTK=ON \
-D WITH_TBB=ON \
-D WITH_EIGEN=ON \
-D WITH_LAPACK=ON \
-D WITH_OPENCL=ON \
-D WITH_OPENEXR=ON \
-D WITH_WEBP=ON \
-D WITH_JASPER=ON \
-D WITH_OPENJPEG=ON \
-D WITH_GPHOTO2=ON \
-D WITH_XINE=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D WITH_DC1394=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D BUILD_opencv_python3=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_opencv_apps=OFF \
-D BUILD_SHARED_LIBS=ON \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
..
# 关键CMake配置(复制后修改显卡算力)
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \ # 编译类型:Release(启用优化,适合最终部署,不包含调试信息)
-D CMAKE_INSTALL_PREFIX=/usr/local \ # 指定 OpenCV 的安装路径(默认是 /usr/local,可自定义为其他目录)
-D WITH_CUDA=ON \ # 启用 CUDA 支持(允许使用 NVIDIA GPU 加速,需提前安装 CUDA Toolkit)
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ # 指定 CUDA 工具包的安装路径(通常是 /usr/local/cuda)
-D CUDA_ARCH_BIN=8.6 \ # 指定支持的 GPU 计算能力(如 RTX 30 系列为 8.6)
-D CUDA_ARCH_PTX="" \ # 不生成 PTX 中间代码(可节省空间,若要兼容更多架构可填如 "8.6")
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ # 指定 opencv_contrib 的 modules 目录,用于编译额外功能模块(如 SIFT 等)
-D WITH_CUDNN=ON \ # 启用 cuDNN 支持(深度学习加速库,需提前安装 cuDNN)
-D BUILD_opencv_cudacodec=ON \ # 编译 CUDA 视频编解码模块(如果4没有选就是OFF,支持 GPU 上的视频压缩/解压,如 H.264/H.265)
-D WITH_CUBLAS=ON \ # 启用 cuBLAS(CUDA 加速的线性代数库,用于矩阵运算)
-D WITH_CUFFT=ON \ # 启用 cuFFT(CUDA 加速的快速傅里叶变换)
-D WITH_NVCUVID=ON \ # 启用 NVIDIA 视频解码加速(NVCUVID,用于硬件解码,如 NVDEC)
-D WITH_OPENGL=ON \ # 启用 OpenGL 支持(用于图形渲染,与 Qt/GUI 相关)
-D WITH_GTK=ON \ # 启用 GTK 图形后端(适用于 Linux 桌面环境显示)
-D WITH_QT=ON \ # 启用 Qt 图形后端支持(可选,用于更现代的 UI)
-D WITH_VTK=ON \ # 启用 VTK(Visualization Toolkit)支持,用于高级 3D 可视化
-D WITH_TBB=ON \ # 启用 Intel TBB(Threading Building Blocks,用于高效多线程并行计算)
-D WITH_EIGEN=ON \ # 启用 Eigen 库支持(C++ 数学运算库)
-D WITH_LAPACK=ON \ # 启用 LAPACK(线性代数库,常用于矩阵运算)
-D WITH_OPENCL=ON \ # 启用 OpenCL 支持(跨平台 GPU/并行计算 API,不限于 NVIDIA)
-D WITH_OPENEXR=ON \ # 启用 OpenEXR 高动态范围图像格式支持
-D WITH_WEBP=ON \ # 启用 WebP 图像格式支持
-D WITH_JASPER=ON \ # 启用 Jasper 图像格式支持(常用于 JPEG2000)
-D WITH_OPENJPEG=ON \ # 启用 OpenJPEG(另一种 JPEG2000 编解码支持)
-D WITH_GPHOTO2=ON \ # 启用 gPhoto2(用于连接和控制相机设备)
-D WITH_XINE=ON \ # 启用 xine 多媒体库支持
-D WITH_V4L=ON \ # 启用 Video4Linux(Linux 系统原生摄像头支持)
-D WITH_LIBV4L=ON \ # 启用 libv4l(V4L 的用户态封装,更稳定)
-D WITH_DC1394=ON \ # 启用 IEEE 1394(FireWire)摄像头支持
-D WITH_FFMPEG=ON \ # 启用 FFmpeg 支持(用于视频文件的读写与编解码)
-D WITH_GSTREAMER=ON \ # 启用 GStreamer 支持(多媒体流处理框架,常用于视频管道)
-D BUILD_opencv_python3=OFF \ # 不编译 Python3 接口(
-D BUILD_opencv_python2=OFF \ # 不编译 Python2 接口
-D BUILD_TESTS=OFF \ # 不编译测试代码(可加快编译速度,减少体积)
-D BUILD_PERF_TESTS=OFF \ # 不编译性能测试代码
-D BUILD_EXAMPLES=OFF \ # 不编译示例程序(如想测试功能可设为 ON)
-D BUILD_DOCS=OFF \ # 不编译文档(可加快编译,减少不必要内容)
-D BUILD_opencv_apps=OFF \ # 不编译 OpenCV 自带的应用程序(如人脸检测等小工具)
-D BUILD_SHARED_LIBS=ON \ # 编译为动态链接库(.so 文件,推荐,节省空间,方便部署)
-D ENABLE_PRECOMPILED_HEADERS=OFF \ # 关闭预编译头(有时可提升编译稳定性或减少问题)
..
这里关闭是否关闭python支持,我是觉得opencv-python可以直接通过pip安装,不需要这么搞,并且如果你以后忘了你已经安装了python支持有这个事情,后面pip安装说不定还有风险。
注意:这里的所有命令环境都应该是系统环境,这也是我之前为什么要关闭自动激活conda的原因。
6.cmake可能遇到的问题


由于我们编译了contri模块,这就需要我们联网去额外下载一些扩展,但是由于服务器原因我们可能超时下载失败(这些下载方式叫raw文件下载加速),但是这并不会影响我们的编译结果,但是这样的编译对我们来说是不够完美的,因此我们可以单独下载这一部分内容并放置在它期望的地方
在老版本中,我们可以在cmake构建的最后添加-DOPENCV_DOWNLOAD_MIRROR_ID=gitcode,切换成gitcode源下载
这个方法我试过之后发现不太行,可能是系统不匹配或者版本较新无法使用。如果你发现你也不成功,那么需要删除build文件夹重新建立然后再cmake配置,不然无法消除之前的命令
那么最简单的下载方式就是,直接点击当时它的下载链接用edge浏览器打开

或者在CMakeDownloadLog.txt中找到,用edge浏览器打开



在edge浏览打开后发现确实下载速度非常慢,但是确实可以持续下载。这个时候又到了我们的加速环节了
在链接前添加https://ghfile.geekertao.top/,即可完成加速
速度快到我来不及截图

然后将其移动到opencv/.cache/ippicv/目录下(.cache可能被隐藏)
同事需要将文件名改为这个未下载完的才可以

如果你觉得这个方法比较繁琐和麻烦,这里还有一种方法
进入opencv/3rdparty/ippicv/中找到ippicv.cmake,直接在源头修改网址即可


同样操作的还有opencv/3rdparty/ffmpeg/ffmpeg.cmake
opencv_contrib/modules/xfeatures2d/cmake目录下的download_boostdesc.cmake和download_vgg.cmake
opencv_contrib/modules/face目录下的CMakeLists.txt
opencv_contrib/modules/wechat_qrcode目录下的CMakeLists.txt
最后快到飞起


7.编译与安装
#build目录下别跑,满功率编译开始!嵌入式设备需要6G以上的交换空间,不然会失败,此cmake配置不适用与嵌入式设备
make -j$(nproc)
如果你跟我一样出现了这个问题,那么很遗憾,这个bug是opencv与cuda不兼容,要么降低cuda版本到11.8,那么提升opencv版本到4.10

经过思考我决定升级opencv版本到4.11。经过三分钟的配置我又回到了这一步。
由于体量过于大,编译了十分钟左右。如果大家只想尝试cuda相关加速的话,这里给出一个cmake配置精简版本
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DWITH_CUDA=ON \
-DCUDA_ARCH_BIN=8.6 \
-DCUDA_ARCH_PTX="" \
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-DWITH_CUDNN=ON \
-DCUDNN_INCLUDE_DIR=/usr/local/cuda/include \
-DCUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so \
-DBUILD_opencv_cudacodec=OFF \
-DENABLE_FAST_MATH=ON \
-DCUDA_FAST_MATH=ON \
-DWITH_CUBLAS=ON \
-DBUILD_EXAMPLES=OFF \
-DBUILD_opencv_python3=OFF \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
..
安装命令
sudo make install
# 配置动态库路径(让系统找到OpenCV库)
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
三、验证
在opencv/samples/cpp路径下留有一个opencv测试案例
mkdir build
cd build/
cmake ..
此时可以看到已经找到了opencv,让我们继续
make
./opencv_example
此时会打开我们的摄像头显示窗口并在左上角输出hello opencv
总结
这么简单,你学会如何安装验证了么?
相信你一定在抓紧补救自己的c/c++的相关知识了,如何可能遭老罪了。




1659

被折叠的 条评论
为什么被折叠?



