一、概述
1. 仓库链接与参考
2. 模块概述
名称 描述 master进程 (master_app) 监控和管理引擎的守护进程,负责策略下发和数据收集。包括网络通信、进程管理、心跳检测、数据封装和解封装模块。 worker进程 (worker_app) 负责视频数据的解码和推理,包括基于OpenCV修改的人脸识别功能。每个进程包含两个工作线程。 轨迹视频叠加服务 (draw-track-server) 基于OpenResty开发,用于在视频上绘制轨迹。
3. 技术要求与设计特点
多进程master-worker工作机制: 项目要求设计。自定义序列化模块: 使用C++11开发,支持二进制序列化和反序列化,具体细节可查看此链接 。
二、master进程与worker进程间管理和交互
1. master管理worker进程
功能概述: master进程负责启动和停止worker进程。参数传递: 仅传递唯一的序号 (0-99) 给worker进程。
2. master心跳检测worker进程
功能概述: master和worker基于共享内存进行心跳检测,确保进程健康运行。
3. master与worker进程之间信息交互
通信模型: 使用基于zmq的发布-订阅模型,实现单向通信。消息过滤: worker根据id过滤消息,同时提供ipc通道以供master订阅。
4. 检测上报流程
流程概述: master下发camera信息至worker,处理后的结果通过自定义序列化发送给master,再传递给轨迹叠加服务。
5. master进程启动worker进程流程
读取配置文件,启动指定数量的worker进程。 下发camera信息至worker进程。
三、程序结构
1. master_app进程
模块关系: 使用boost库处理配置文件读取、进程管理、HTTP上传等功能。
2. worker_app进程
模块关系: 包括ffmpeg解码、CUDA加速、Nvmpi解码等功能,以及消息队列缓存和调试宏。
四、轨迹视频叠加服务器
1. 程序结构
模块概述: 包括视频和轨迹叠加模块、基于OpenResty的HTTP服务、测试客户端程序。
2. 工作流程
nginx转发HTTP请求至do_upload.lua,处理轨迹文本和视频文件。 调用libvideo_bbox_drawer.so完成轨迹和视频的叠加。
五、关键结构体设计
上报检测轨迹: 用于worker和轨迹叠加服务的数据结构。
struct Rect_t
{
uint32_t x = 0 ;
uint32_t y = 0 ;
uint32_t w = 0 ;
uint32_t h = 0 ;
} ;
struct Track_t
{
uint32_t f = 0 ;
Rect_t rect;
} ;
struct TrajectoryInfo_t
{
std:: string video_name;
uint32_t video_width;
uint32_t video_height;
uint32_t video_framerate;
std:: vector< Track_t> tracks;
} ;
zmq消息通信结构体: 用于master和worker进程间通信。
struct CameraInfo_t
{
char name[ 64 ] = { 0 } ;
char main_stream[ 128 ] = { 0 } ;
char alg_param_file[ 128 ] = { 0 } ;
char camera_id[ 64 ] = { 0 } ;
uint32_t main_pixel_w = 0 ;
uint32_t main_pixel_h = 0 ;
uint32_t main_frame_rate = 0 ;
} ;
struct VideoAndTracks_t
{
std:: string tracksStr;
std:: string videoName;
std:: string videoData;
} ;
六、软件开发依赖
C++11、libboost1.66+、libzmq、libffmpeg4.2+、libopencv4.4+ openresty
cpp_master_worker依赖第三方库地址