模型下载地址:
http://dl.caffe.berkeleyvision.org/
配置文件下载:
https://github.com/opencv/opencv_extra/tree/4.x/testdata/dnn
该段代码是一个利用深度学习进行语义分割的OpenCV应用实例。下面将详细解释代码的功能和方法。
引入库
引入了一些必要的C++和OpenCV库,其中包括文件流、字符串处理、深度学习网络(dnn模块)、图像处理和高层图形界面。
参数字符串
定义了一些命令行参数,用于获取模型信息、图像处理以及设备选择等配置。
自定义函数
定义了showLegend和colorizeSegmentation两个函数,用于显示分类的图例及为分割结果上色。
主函数main
主函数执行以下主要步骤:
解析命令行参数:使用OpenCV的CommandLineParser来获取命令行输入的参数。
读取模型和配置:根据参数从文件中读取深度学习模型及其配置。
读取类别和颜色信息:如果提供了类名和颜色的文件路径,则从文件中读取这些信息。
设置网络:将模型和配置设置到网络中,并且选择计算后端和目标设备。
处理视频帧或图片:循环从视频流或文件中读取帧,并对其进行处理:
将帧转换为模型输入所需的blob。
将blob作为网络的输入。
进行网络前向传播,获取分割的score。
使用colorizeSegmentation函数将分割的score转换成彩色分割图。
结合原始帧和彩色分割图,显示在用户界面上。
如果有类别信息,显示图例窗口。
图像分割和上色
colorizeSegmentation函数计算每个像素点的最大得分类别,并将对应颜色填充到分割图中。
showLegend函数在独立窗口中显示每个类别及其对应颜色的图例。
运行流程
用户通过命令行运行程序,可以选择加载本地视频文件、图像文件或打开摄像头。程序会连续读取帧,并将每一帧通过神经网络进行分析,实现实时的图像分割功能。分割结果彩色化后与原图结合,展现给用户。
总的来说,这段代码实现了通过深度学习模型对图像进行实时语义分割,并通过OpenCV的GUI功能将结果呈现给用户。它可以很好地适用于视频流分析,如自动驾驶车辆的视觉系统中实时理解道路情况。
#include <fstream> // 包含fstream库,用于文件的读写操作
#include <sstream> // 包含sstream库,用于字符串流的操作
#include <opencv2/dnn.hpp> // 包含OpenCV深度神经网络(dnn)部分的头文件
#include <opencv2/imgproc.hpp> // 包含OpenCV图像处理部分的头文件
#include <opencv2/highgui.hpp> // 包含OpenCV用户界面部分的头文件
#include "common.hpp" // 包含示例代码中定义的通用函数和变量
// 声明并初始化一个存储命令行参数的字符串
std::string keys =
"{ help h | | Print help message. }" // 帮助信息
"{ @alias |fcn8s | An alias name of model to extract preprocessing parameters from models.yml file. }"