使用cv2.resize缩小8路4K视频时出现像素化问题求助
解决8路4K视频缩小后的像素化问题
问题根源
你直接将4K(3840×2160)视频帧一步缩放到1920//8=240×1080//8=135的尺寸,属于超大比例缩小。INTER_LINEAR双线性插值更适合小幅度缩放,面对这种大比例降采样时,容易丢失细节导致像素化。
优化方案1:分步缩放+INTER_AREA插值
不要一步缩到目标尺寸,分多步逐步缩小,每一步使用专门针对降采样优化的INTER_AREA插值,能最大程度保留画面细节:
import cv2 import numpy as np from datetime import datetime NUM=8 target_w = 1920 // NUM target_h = 1080 // NUM blank=np.zeros((target_h, target_w, 3), np.uint8) cv2.namedWindow("win", cv2.WINDOW_NORMAL) key = -1 # 初始化key避免未定义报错 t=datetime.now() while key!=ord("q"): check_fill_caps(caps,vids) frames=[] for c in caps: ret,frame=c.read() if ret: # 分步缩小:三次1/2缩放后达到1/8的比例 temp = cv2.resize(frame, (frame.shape[1]//2, frame.shape[0]//2), interpolation=cv2.INTER_AREA) temp = cv2.resize(temp, (temp.shape[1]//2, temp.shape[0]//2), interpolation=cv2.INTER_AREA) frame = cv2.resize(temp, (target_w, target_h), interpolation=cv2.INTER_AREA) else: frame=blank frames.append(frame) if len(frames)%2 !=0: frames.append(blank) up=np.concatenate(tuple(frames[0:len(frames)//2]),axis=1) down=np.concatenate(tuple(frames[len(frames)//2:]),axis=1) whole=np.concatenate((up,down),axis=0) cv2.imshow("win",whole) key=cv2.waitKey(1) # 改为1实现实时播放,按q退出 # 释放资源 cv2.destroyAllWindows() for cap in caps: cap.release()
优化方案2:直接替换插值方法
如果不想改分步逻辑,直接把插值方式换成INTER_AREA,也能明显改善像素化问题:
frame=cv2.resize(frame,(target_w, target_h),interpolation=cv2.INTER_AREA)
额外修复点
- 原代码未初始化
key变量,会触发运行报错,需提前赋值key = -1 cv2.waitKey(0)会让程序停在每一帧,需按任意键才继续,实时播放场景建议改为cv2.waitKey(1)- 程序结束时记得释放视频捕获对象和销毁窗口,避免资源泄漏
内容的提问来源于stack exchange,提问作者sumit kshirsagar
相关产品推荐
相关产品推荐

