在完成RTSP推流之后,尝试通过开发板接收的视频流数据进行目标检测,编写了一个shell脚本实现该功能,关于视频推流和rknn模型的部署请看之前的内容或者参考官方的文档。
#!/bin/bash
# 设置脚本使用的shell解释器为bashSEGMENT_DIR="./segmented_videos"
# 定义一个变量SEGMENT_DIR,用于存储分割后的视频文件的目录路径mkdir -p "$SEGMENT_DIR"
# 使用mkdir命令创建SEGMENT_DIR指定的目录,如果目录已存在则不会报错capture_and_segment() {ffmpeg -i rtsp://10.19.15.28:8554/camera_test -c copy -map 0 -f segment -segment_time 5 -reset_timestamps 1 -strftime 1 "${SEGMENT_DIR}/output_%Y-%m-%d_%H-%M-%S.mp4" &echo $! > "ffmpeg_pid.txt"
}
# 定义一个名为capture_and_segment的函数,该函数使用ffmpeg命令从RTSP流中捕获视频,并将其分割为5秒的片段。每个片段的文件名包含当前的时间戳。同时将ffmpeg进程的PID写入到ffmpeg_pid.txt文件中。run_yolov5_demo() {local video_file="$1"echo "Processing $video_file"./yolov5seg_videocapture_demo ./model/yolov5s_seg.rknn "$video_file"rm "$video_file"echo "Finished processing $video_file"
}
# 定义一个名为run_yolov5_demo的函数,该函数接受一个视频文件作为参数,并使用yolov5seg_videocapture_demo程序和预训练的YOLOv5分割模型对视频进行分割。处理完成后删除原始视频文件。cleanup() {echo "Cleaning up..."kill $(cat ffmpeg_pid.txt)rm ffmpeg_pid.txtrm -f ${SEGMENT_DIR}/*.mp4exit
}
# 定义一个名为cleanup的函数,该函数用于在脚本被中断时执行清理操作。它会杀死ffmpeg进程,删除ffmpeg_pid.txt文件,以及删除SEGMENT_DIR目录下的所有mp4文件。trap cleanup SIGINT
# 使用trap命令注册cleanup函数,以便在脚本接收到SIGINT信号(通常是由于用户按下Ctrl+C)时执行清理操作。capture_and_segment
# 调用capture_and_segment函数开始捕获和分割视频流。while inotifywait -q -e close_write --format '%w%f' "${SEGMENT_DIR}"; dolatest_file=$(ls -t ${SEGMENT_DIR}/*.mp4 | head -n 1)if [[ -f "$latest_file" ]]; thenfind ${SEGMENT_DIR} -type f -name '*.mp4' ! -name "$(basename "$latest_file")" -exec rm {} +run_yolov5_demo "$latest_file"fi
done
# 使用while循环和inotifywait命令监控SEGMENT_DIR目录,当有新的视频文件被关闭写入时,找到最新的视频文件,删除其他文件,然后调用run_yolov5_demo函数处理最新的视频文件。
该脚本实现了一个自动化的视频监控流程,通过ffmpeg
实时捕获RTSP视频流并分割成5秒一段的视频文件,然后利用YOLOv5模型对这些视频片段进行图像分割处理。脚本还包括后台处理、进程PID管理、文件系统事件监控以及资源清理功能,确保在接收到中断信号时能够妥善终止进程并清理文件,有效管理存储空间。测试结果如下所示
由于实例分割模型的FPS较低,所以有较高的延迟,后续可以使用目标检测模型进行测试,效果应该会更好。