帧变量像素是整个帧
环境
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)[这是FullHD视频的标准分辨率]。
摄像机旋转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)
(宽度= 198,高度= 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。
[现在我意识到您的问题可能重复了]。
MCC-HC Player中
vid90
的第一个视频帧:Python(matplotlib)中
vid90
的第一个视频帧:关于python - 捕获视频后旋转整个帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59732063/