OpenCV调用imshow播放视频resize缩放后出现窗口闪烁问题求助
问题原因
- 核心触发点是你对同一个窗口名
Video连续调用了两次cv.imshow():先输出原分辨率帧,立刻又输出缩放后的帧,两个不同尺寸的帧反复在同一个窗口渲染,自然会出现闪烁效果 - 次要原因:
cv.waitKey(20)对应的是50fps的刷新间隔,你的原视频是60fps,帧刷新节奏不匹配也可能加重闪烁问题 - 笔误问题:你代码末尾的
cv.destroyAllwindows()拼写错误,正确应为cv.destroyAllWindows()(首字母W大写),虽然不是闪烁直接原因,但会导致窗口无法正常销毁,可能引发后续运行的异常。
解决方法
1. 移除重复的imshow调用
如果只需要播放缩放后的视频,删掉cv.imshow('Video', frame)这一行即可,修改后的循环逻辑如下:
while True: isTrue, frame = capture.read() # 补充判断视频读取结束的逻辑,避免读取到空帧时报错 if not isTrue: break frame_resized = rescaleFrame(frame, scale=0.2) # 仅输出缩放后的帧到窗口 cv.imshow('Video', frame_resized) # 60fps对应的等待时间约为16ms,调整更适配原视频帧率 if cv.waitKey(16) & 0xFF == ord('d'): break capture.release() # 修正拼写错误 cv.destroyAllWindows()
2. 如果需要同时播放原视频和缩放后视频,给两个窗口设置不同的名称
# 原视频输出到Original Video窗口,缩放后输出到Resized Video窗口 cv.imshow('Original Video', frame) cv.imshow('Resized Video', frame_resized)
3. 额外优化(可选)
如果调整后仍有轻微闪烁,可以修改resize的插值方式为cv.INTER_LINEAR,该插值方式更适合视频场景的缩放,运算速度也更快。
内容的提问来源于stack exchange,提问作者Sprinngam
相关产品推荐
相关产品推荐

