【问题标题】:The entire frame is rotated after video capture视频拍摄后整帧旋转
【发布时间】:2020-05-01 01:52:09
【问题描述】:

帧变量像素是整个帧

环境

  • 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

我该怎么做? 谢谢

【问题讨论】:

  • 所以只有你的宽度和高度被翻转了?还是整个框架都旋转了?
  • 整个框架旋转

标签: python python-3.x video opencv3.0


【解决方案1】:

您的视频按元数据设置旋转,而不是编码为 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 工具查看视频元数据:

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

MPC-HC Player中vid90的第一帧视频:

vid90 在 Python (matplotlib) 中的第一个视频帧:

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多