Hero Image
从源码编译OpenCV 4.5.x:深度学习与CUDA加速实战指南

从源码编译OpenCV 4.5.x:深度学习与CUDA加速实战指南 在这篇图文并茂的指南中,我们着重讲解如何在Windows 10环境下通过CMake构建OpenCV 4.5.x的定制版本,特别关注深度学习模块(DNN)与CUDA加速的配置方法。我们将通过结构化流程图和关键配置点标注,帮助开发者快速完成编译环境搭建,确保DNN推理模块能够充分利用NVIDIA GPU资源。 🔧 环境准备 硬件要求 - NVIDIA GPU(CUDA兼容设备) - >= 8GB显存(建议16GB以上) 软件依赖 1. Visual Studio 2019(需安装C++桌面开发套件) 2. CUDA Toolkit 11.3+ (**需与cuDNN版本对应**) 3. cuDNN 8.2+(下载路径示例:https://developer.nvidia.com/cudnn) 4. Git命令行工具 📦 源码下载与工程初始化 源码获取(Git操作) :: 进入工作目录 cd /d D:/WORK/opencv-github :: 克隆核心库 git clone https://github.com/opencv/opencv.git -b 4.5.2 # 注意添加tag或branch指定版本 :: 克隆扩展模块库 git clone https://github.com/opencv/opencv_contrib.git -b 4.5.2 TIP 直接在GitHub页面切换对应版本更稳妥(commit版本记录见下图) 🔧 CMake配置流程详解 配置界面流程图 graph TD A[启动CMake-GUI] --> B[设置源目录] B --> C[设置构建目录] C --> D[首次Configure选择VS2019x64] D --> E[等待IPPICV自动下载] E --> F[再次Configure应用结果] F --> G[设置OPENCV_EXTRA_MODULES_PATH] G --> H[启用CUDA相关选项] H --> I[勾选必要编译选项] I --> J[Generate生成VS工程] 关键配置项解析 1. 模块路径设置 Name: OPENCV_EXTRA_MODULES_PATH Path: D:/WORK/opencv-github/opencv_contrib/modules 2. CUDA加速相关配置 FolderPath[CUDA选项区]: - WITH_CUDA → ON - OPENCV_DNN_CUDA → ON - WITH_CUDNN → ON - CUDA_FAST_MATH → ON 注意点: - 禁用 BUILD_CUDA_STUBS(防止生成无效模拟代码) - CUDA gfx平台无需启用(Windows默认支持x64) 3. 高级优化选项 优化选项配置组: - BUILD_opencv_world → ON(唯一动态库模式) - BUILD_DOCS → OFF(禁用文档生成) - ENABLE_NONFREE → ON(启用专利算法模块)

Hero Image
使用Docker辅助图像识别程序开发:在Docker中访问GPU和、USB相机以及网络

引言 在操作系统中发行应用程序,尤其是python应用程序,其环境配置常常是分发过程中的重要一环。如果像开发的时候那样手动构建,一方面工作量难以承受,另一方面经常会出现各种各样的问题。在不同的目标主机上手动构建环境,会受到目标操作系统的版本、文件系统、所安装软件包的情况影响。而且开发时所使用的一些默认安装包,到了发布的时候可能已经都被更新过,所以手动构建要求使用的包版本号也精确记录。 安装和配置 安装GPU docker,首先需要安装docker,然后在docker的基础上安装nvidia-docker。 安装docker 参考链接 https://docs.docker.com/engine/install/ubuntu 安装nvidia-docker 参考链接 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker 在docker中显示GUI 如果在Docker中开发的是带有GUI的应用程序,也就是在docker中显示GUI,需要启动支持GUI的docker镜像。 首先配置一下xhost xhost +local:docker 或者 xhost + 启动docker,由于需要docker中显示GUI,所以加入参数 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY 完整指令如下: docker run --name mydocker --gpus all --shm-size=1g --ulimit memlock=-1 -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY snn-server:basic 注意,这里是启动了GPU docker,–gpus all是指定使用所有的GPU,如果只使用一块GPU,可以指定为–gpus 0。 在Docker中访问usb相机 如果需要在docker中访问usb相机,需要在启动docker的时候,追加以下参数 -v /dev/video0:/dev/video0 --device=/dev/video0 这样就把宿主机的/dev/video0映射到docker中的/dev/video0,然后在docker中就可以访问到相机了。 docker run --name mydocker --gpus all --shm-size=1g --ulimit memlock=-1 -v /dev/video0:/dev/video0 --device=/dev/video0 -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY myimage:latest 在Docker镜像中开放端口 如果需要从docker中对外提供服务,需要在docker中向宿主机进行端口映射,才可以从宿主机访问到docker中的服务。 Docker中的端口映射,需要在启动docker的时候,加入参数 -p 8080:8080 这样,宿主机的8080端口就映射到docker中的8080端口了。

Hero Image
Hero Image
OpenCV 4.X 使用CvxText在图片显示汉字

最近又需要在图像上实时绘制汉字。一般来讲如果绘制汉字的需求绕不过的话,直接绘制在图片总归是最easy的实现方式。因为不然的话可能要额外调用GUI组件来实现。一般都是用freetype+cvxtext,老生常谈。且不说实际实现起来是否最easy,主要是这种方法多年来实践了无数次了,不过今次切换到OpenCV4.5,突然发现可能又要修改CvxText代码才可以,因为直接使用,不work。 准备 需要的依赖有: C/C++ 编译环境(似乎是废话) OpenCV (仍然废话) freetype的lib: 提前编译好,官网是 https://freetype.org/,我使用的版本是2.9.1 字体文件,一般用simhei.ttf。在操作系统的字体里面哦。 修改 CvxText 代码 我这里有一份CvxText代码,在旧版本的OpenCV下可以使用(OpenCV3.X)。如今更换到了OpenCV4.5,这份代码直接使用会有些小问题,不过都很容易修改。 OpenCV头文件包含方式 首先需要重写头文件包含方法。在OpenCV4以前,include下有两个子目录,分别是opencv,和opencv2。在OpenCV4.X后,include下只剩一个opencv2文件夹了。涉及到opencv的头文件包含代码,改为如下形式: #include "opencv2/core/core.hpp" #include "opencv2/core/core_c.h" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" 这里特别说明,引入core_c.h这个头文件很重要。因为我手里这份CvxText代码类型都是基于旧式的C类型,core_c.h 提供了对C类型的兼容。 CvScalar类型问题 下一处需要修改的是和CvScalar相关的代码。尽管我们重新写了头文件包含,引入了C类型,但是有些代码仍然不能直接编译通过, 因为CvScalar不能隐式的转为C++类型的cv::Scalar。下面的puttext函数代码中,我修改了显式的手工转换替代了注释中的代码。样子很丑,但是简单好用(总共花费了不到1分钟)。 int CvxText::putText(cv::Mat &frame, const char *text, CvPoint pos) { //return putText(frame, text, pos, CV_RGB(255, 255, 255)); CvScalar s = {255, 255, 255}; return putText(frame, text, pos, s); } int CvxText::putText(cv::Mat &frame, const wchar_t *text, CvPoint pos) { //return putText(frame, text, pos, CV_RGB(255, 255, 255)); CvScalar s = {255, 255, 255}; return putText(frame, text, pos, s); } cv::Mat转为IplImage 另一处就是比较老生常谈的问题,cv::Mat转为IplImage。这里之前的实现是直接采用C形式的强制转换,如下所示: