Python下獲取視訊的旋轉角度資訊

m_buddy發表於2020-12-29

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旋轉影像

相關文章