使用同一类显示多源视频流时色彩闪烁问题排查与解决
多路摄像头流并发显示色彩闪烁问题解决
问题现象
- 实现了内置2个工作线程的视频处理类,用于完成USB摄像头、IP网络摄像头的视频流采集与画面显示
- 多路流并行场景下,为每一路视频流单独实例化该类,仅对对应工作线程做重命名区分
- 单路流运行时所有功能正常,当同时启动1路以上视频流时,画面出现无规律色彩闪烁问题
根因定位
问题出在图像处理流程的变量使用逻辑上:
图像处理链路包含
BGR2RGB色彩空间转换、Resize画面缩放、putText文本叠加等步骤,所有处理步骤全程复用同一个图像变量存储中间结果。
多线程并发运行时,不同流实例的图像处理流程会出现变量读写竞争,当前流的中间处理结果可能被其他流的处理逻辑覆写,最终渲染阶段拿到的是被交叉篡改的图像数据,直接表现为色彩闪烁。单流场景下不存在多实例竞争,因此不会触发该问题。
修复方案
将图像处理流程中每一步的中间结果存储变量改为独立命名,切断不同处理步骤、不同流实例之间的变量读写冲突。修改完成后多路流并发运行时的色彩闪烁问题完全解决。
问题代码参考(变量复用)
# 全流程复用同一个img变量,多线程下存在读写竞争 img = stream_capture.read() img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (target_width, target_height)) img = cv2.putText(img, stream_label, (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
修复后代码参考(独立变量存储各阶段结果)
# 每一步处理使用独立命名的变量,避免跨流程读写冲突 raw_frame = stream_capture.read() rgb_frame = cv2.cvtColor(raw_frame, cv2.COLOR_BGR2RGB) resized_frame = cv2.resize(rgb_frame, (target_width, target_height)) display_frame = cv2.putText(resized_frame, stream_label, (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
内容的提问来源于stack exchange,提问作者Chorum
相关产品推荐
相关产品推荐

