You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:09:34