OpenCV全屏播放16:9视频时保持比例避免拉伸的解决方案咨询
解决OpenCV视频播放拉伸问题:保持比例+上下黑边
嗨,我来帮你搞定这个视频拉伸的问题!你想要的16:9视频在16:10显示器上保持原比例、上下显示黑边的效果,用OpenCV完全能实现——核心是手动处理每一帧的缩放和黑边填充,而不是只依赖窗口的比例设置。下面是具体的解决方案:
问题根源
你之前用的cv2.WINDOW_KEEPRATIO只是让窗口本身的尺寸保持比例,但OpenCV的imshow默认会把帧拉伸填充整个窗口,所以还是会出现变形。我们需要主动计算缩放后的视频尺寸,把它放在和屏幕同尺寸的黑背景中央,再显示这个合成后的画面。
完整代码实现
import cv2 import numpy as np # 加载视频 vid = cv2.VideoCapture('video.mp4') if not vid.isOpened(): print("无法打开视频文件") exit() # 获取视频原始宽高和比例 vid_width = int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)) vid_height = int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT)) vid_ratio = vid_width / vid_height # 16:9的话约等于1.777 # 创建全屏窗口 cv2.namedWindow('My Window', cv2.WINDOW_NORMAL) cv2.setWindowProperty('My Window', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) # 获取全屏窗口的实际宽高和比例 screen_width = cv2.getWindowImageRect('My Window')[2] screen_height = cv2.getWindowImageRect('My Window')[3] screen_ratio = screen_width / screen_height # 16:10的话是1.6 # 计算缩放因子:保证视频按原比例缩放后能完整放入屏幕 if vid_ratio > screen_ratio: # 视频更宽,以屏幕宽度为基准缩放 scale_factor = screen_width / vid_width else: # 视频更高,以屏幕高度为基准缩放 scale_factor = screen_height / vid_height # 计算缩放后的视频尺寸 scaled_width = int(vid_width * scale_factor) scaled_height = int(vid_height * scale_factor) # 计算视频在黑背景中的居中位置 x_offset = (screen_width - scaled_width) // 2 y_offset = (screen_height - scaled_height) // 2 # 循环播放每一帧 while vid.isOpened(): ret, frame = vid.read() if not ret: break # 视频播放结束 # 缩放视频帧到目标尺寸 scaled_frame = cv2.resize(frame, (scaled_width, scaled_height), interpolation=cv2.INTER_AREA) # 创建和屏幕同尺寸的黑背景 black_bg = np.zeros((screen_height, screen_width, 3), dtype=np.uint8) # 将缩放后的视频帧放到黑背景中央 black_bg[y_offset:y_offset+scaled_height, x_offset:x_offset+scaled_width] = scaled_frame # 显示合成后的画面 cv2.imshow('My Window', black_bg) # 按Q键退出播放 if cv2.waitKey(25) & 0xFF == ord('q'): break # 释放资源 vid.release() cv2.destroyAllWindows()
关键步骤解释
- 获取尺寸与比例:分别拿到视频和全屏窗口的宽高、比例,判断哪个维度需要作为缩放基准。
- 计算缩放因子:确保视频缩放后不会超出屏幕,同时完全保持原比例。
- 黑背景合成:创建和屏幕一样大的黑色画布,把缩放后的视频帧居中放置,这样上下(或左右)就会自动出现黑边。
- 循环播放处理:每一帧都重复缩放、合成、显示的步骤,保证全程比例正确。
这样播放出来的效果就和KMPlayer一样啦,视频不会变形,上下会有均匀的黑边填充屏幕剩余空间。
内容的提问来源于stack exchange,提问作者sd70
相关产品推荐
相关产品推荐

