2017-06-06 265 views
0

我们将视频保存到移动客户端并发送到服务器。在服务器上,我使用下面的代码保存帧:>opencv - 视频看起来不错,但帧旋转90度

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)文件中,该视频文件知道正确的方向?

+0

任何理由使用'skvideo.io'在'cv2.VideoCapture' API? – ZdaR

回答

1

它看起来像OpenCV不记录视频文件的元数据旋转与VideoCapture(),你可以通过propId s表示它卖场看看。我不确定scikit-video是不是。看起来他们有一个称为ffprobe的元数据抽取程序,它可能能够抽取轮换。有关如何调用和查看输出的示例,请参见here。这显示了一个大量的元数据---不旋转---但这可能只是因为它没有设置或没有旋转元数据的电影类型。

抓住它的另一种方法是直接从ffmpeg读取元数据。我找到了一个old StackOverflow answer,它使用ffmpeg编写了一些python代码,用于从视频中特别提取旋转元数据。

+0

对钱的权利!谢谢 –

+0

@AlejandroSimkievich如果你找到一个精确的解决方案'scikit-video'或'ffmpeg',你应该用它编辑你的原始问题,这样其他人可以很容易地得到这个问题! –

+0

好点,做 –

1

在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回购的问题,采取进一步参考看看:https://github.com/scikit-video/scikit-video/issues/40

+0

伟大的工作挖掘解决方案! –

+0

谢谢!如果你支持我的解决方案,我不会被冒犯! :) –