最近想做一个关于图传类型的小系统,想利用wifi和本地ip读开发板的视频流。想到利用rtsp来取流,但是不知道为什么读流延迟很大,并且帧率很低。可能是我太菜了hhh。。。然后web端可以设置远程摄像头开关、拍照、简单的AI功能(区域入侵警报)

所以我受到sherpa-onnx框架的启示,利用http来推流,然后制作一个网页web,来进行读流,发现效果还不错,延迟基本上就200-300ms左右,帧率的话基本上跟本地读流差不多。

1、利用多线程和多核线程池进行目标检测,基本上yolov8s模型可以跑满摄像头帧率。视频的话可以有50~60帧。这个网上很多,随便找一找,因为c++在网络方面不是很方便,所以推荐用python版本的。可以利用flask包来进行。

2、整个工程大致分为3个总线程

1. 摄像头捕获和处理线程(capture_loop)

  • 这是一个显式创建的线程,通过 threading.Thread 启动,用于从摄像头捕获视频帧,并将其放入 RKNN 池进行处理。

  • 它不断地读取摄像头的帧,将原始帧放入 RKNN 池进行推理,获取处理后的帧(带有标注信息),然后进行报警检测、录像等功能。

2. RKNN 池中的工作线程(由 rknnPoolExecutor 管理)

  • RKNN 池初始化时指定了 TPEs=3,这意味着它会创建 3 个工作线程(或进程,具体取决于 rknnPoolExecutor 的实现)。

  • 这些线程负责从队列中获取待处理的帧,使用 RKNN 模型进行推理(执行 myFunc 函数),并对帧进行标注等操作。

3. Flask 框架的内部线程

  • 当运行 app.run(host='0.0.0.0', port=5000, threaded=True) 时,Flask 默认会启动多个线程来处理客户端请求。

  • 这些线程用于处理各种 HTTP 请求,比如提供网页(index 路由)、生成视频流(video_feed 路由)、处理摄像头开关操作(toggle_camera 路由)等。

3、成果展示

可以看到延迟还是有的,这里的延迟包括了网页传输+目标检测推理。所以效果还是很不错的。

多平台同时拉流展示

更多推荐