opencv - 视频看起来不错但框架旋转了90度

时间:2017-06-06 02:23:52

标签: python opencv

我们将视频保存在移动客户端上并将其发送到服务器。在服务器上,我使用以下代码保存框架:>

import skvideo.io
import cv2

haar = 
'/home/ubuntu/opencv/data/haarcascades/haarcascade_frontalface_alt.xml'
face_cascade = cv2.CascadeClassifier(haar)

ret = True

video = 'my_video.mov'
i = 0
while ret == True:
    cap = skvideo.io.VideoCapture(video)
    ret, frame = cap.read()
    cv2.imwrite('frame_'+str(i)+'.jpg',frame)
    i+=1

当我们在Windows媒体播放器或itunes上播放视频时,它看起来不错。即玩家知道如何定位它。

但skvideo.io不知道,我们保存的那些帧逆时针旋转了90度。

我们如何将信息嵌入到视频文件(.mov)文件中,该视频文件知道正确的方向?

3 个答案:

答案 0 :(得分:4)

skvideo中出现了一个小故障,它没有读取可用的元数据。对于在移动设备中拍摄的视频是旋转的,但元数据包括此类参数skvideo团队提交了一个修复程序,当前的skvideo版本1.1.7从移动设备读取元数据,表明视频应该是漫游的。然后skvideo.io.vread旋转文件:

1)使用较新的skvideo版本,1.1.7可以在https://github.com/scikit-video/scikit-video克隆

2)您可以使用以下代码来阅读视频中的所有帧,很可能会读取元数据

import skvideo.io
videogen = skvideo.io.vread(f.name)

如果以纵向模式拍摄,将自动旋转视频。

3)在skvideo repo上创建了一个问题,请查看更多参考资料:https://github.com/scikit-video/scikit-video/issues/40

答案 1 :(得分:3)

OpenCV似乎没有使用VideoCapture()记录视频文件的轮播元数据,正如您所存储的propId所见。

我不确定scikit-video是否有。看起来他们有一个名为ffprobe的元数据拉取器,它可以拉动旋转。有关如何调用和查看输出的示例,请参阅here。这显示了一个庞大的元数据列表 - 没有旋转---但这可能只是因为它没有设置或者没有旋转元数据的电影类型。

获取它的另一种方法是直接从ffmpeg读取元数据。我发现old StackOverflow answer编写了一些python代码,使用ffmpeg专门从视频中提取旋转元数据。

答案 2 :(得分:1)

我安装了'ffmpeg'('ffprobe')。我的电脑是 Ubuntu 18.04。 然后 Python,get_rotation() 函数对我有用。

功能代码:

import subprocess
import shlex
import json
def get_rotation(self, file_path_with_file_name):
    cmd = "ffprobe -loglevel error -select_streams v:0 -show_entries stream_tags=rotate -of default=nw=1:nk=1"
    args = shlex.split(cmd)
    args.append(file_path_with_file_name)
    ffprobe_output = subprocess.check_output(args).decode('utf-8')
    if len(ffprobe_output) > 0:  # Output of cmdis None if it should be 0
        ffprobe_output = json.loads(ffprobe_output)
        rotation = ffprobe_output
    else:
        rotation = 0
    return rotation