1.説明
携帯電話やその他の電子製品を使用して記録されたビデオは、コンピューターで再生するとポジティブですが、OpenCVライブラリを使用して読み取ると、角度が異なります。これは、OpenCVがビデオの内部ストレージを考慮しないためです。ビデオデータの読み取りTAG情報(回転角度などを含む)ですが、OpenCVライブラリを使用するとビデオの回転角度情報を取得できません。このために、Pythonパッケージscikit-video
を使用して取得できます。
インストールscikit-video
:
pip install scikit-video
2.参照コード
import cv2
import skvideo.io
# 得到旋转角度之后,对视频帧旋转对应的负角度便可以得到正向的图像
def rotate_img_data(img_data, degree):
h, w = img_data.shape[:2]
(cx, cy) = (w / 2, h / 2)
# 设置旋转矩阵
M = cv2.getRotationMatrix2D((cx, cy), -degree, scale=1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
# 计算图像旋转后的新边界
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
# 调整旋转矩阵的移动距离(t_{x}, t_{y})
M[0, 2] += (nW / 2) - cx
M[1, 2] += (nH / 2) - cy
img_rotated = cv2.warpAffine(img_data, M, (nW, nH))
return img_rotated
if __name__ == "__main__":
file_name = "test.MOV"
# get video info(rotate)
video_metadata = skvideo.io.ffprobe(file_name)
#video_tag_info = video_metadata['video']['tag']
rotate_degree_info = -1.0
for tag_info in video_metadata['video']['tag']:
for key, val in tag_info.items():
if val == "rotate":
rotate_degree_info = float(tag_info["@value"])
print("Info: video rotate degree info:{}".format(rotate_degree_info))
break
# read video sequence
video_io = cv2.VideoCapture(file_name)
all_frame_nums = video_io.get(cv2.CAP_PROP_FRAME_COUNT)
read_status, video_frame = video_io.read()
while read_status:
# rotate the image if needs
if abs(-1.0 - rotate_degree_info) > 1.0:
video_frame = rotate_img_data(video_frame.copy(), rotate_degree_info)
read_status, video_frame = video_io.read()
PS:コードの回転部分は次のとおりです:OpenCVとPythonを正しく使用して画像を回転させます