gpt4 book ai didi

python - 视频捕获后整个帧旋转

转载 作者:行者123 更新时间:2023-12-01 06:34:44 24 4
gpt4 key购买 nike

帧变量像素是整个帧

环境

  • Python 版本
3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
  • opencv版本
opencv-contrib-python==4.1.2.30
opencv-python==4.1.2.30

电影文件30秒

框架高度 = 1920,宽度 = 1080

cap = cv2.VideoCapture(video_file_path)
frames = []
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
frames.append(frame)
else:
break
plt.imshow(frames[0])

执行时高度 = 1080,宽度 = 1920

我该怎么办?谢谢

最佳答案

您的视频根据元数据设置进行旋转,并且未编码为 1080x1920。

最可能的解释是视频分辨率为1920x1080(宽度=1920,高度=1080)[这是全高清视频的标准分辨率]。
也有可能视频是通过将摄像头旋转 90 度拍摄的。

可以将元数据添加到视频文件中,标记播放器在播放时旋转视频,而不是解码视频、旋转每个帧并对帧进行编码。
添加元数据更有效(花费最少的时间)并且可能具有更好的质量(因为它节省了解码和编码阶段)。

以下是通过使用 FFmpeg 设置元数据来旋转 mp4 的示例: Rotate mp4 videos without re-encoding

当 OpenCV 读取视频帧时,它会以原始方向读取(1920x1080 而不是 1080x1920)。

这是关于大多数视频元数据的常见约定 - OpenCV 假设您知道元数据标志设置为“旋转”,并假设您负责在显示帧之前旋转帧(您的 Python 程序假设做玩家的工作)。

以下是使用 FFmpeg 创建示例 mp4 视频文件的示例(在命令行中):

ffmpeg -y -r 10 -f lavfi -i testsrc=rate=10:size=198x108 -t 5 -c:v libx264 vid0.mp4

以下是通过设置元数据旋转视频的示例:

ffmpeg -i vid0.mp4 -c copy -metadata:s:v:0 rotate=90 vid90.mp4

在以下Python代码中,两个视频的帧形状相同:(108, 198, 3) (width=198, height=108):

import cv2
from matplotlib import pyplot as plt

# video_file_path = 'vid0.mp4'

video_file_path = 'vid90.mp4'

cap = cv2.VideoCapture(video_file_path)
frames = []
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
frames.append(frame)
else:
break

plt.imshow(frames[0])

您可以使用 mediainfo 检查视频元数据工具:

enter image description here

在Python中读取元数据比我想象的更困难(我从未尝试过)。
您可能会找到解决方案 here .
[现在我意识到你的问题可能是重复的]。

MPC-HC播放器中vid90的第一个视频帧:
enter image description here

Python 中 vid90 的第一个视频帧 (matplotlib):
enter image description here

关于python - 视频捕获后整个帧旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59732063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com