抖音視頻抖動原理
感興趣的不妨隨便弄一個視頻使用抖音抖動效果觀察扳躬。這里只搁,博主建議讀者使用國際象棋的視頻圖像盗痒,這種方塊的格式更能看清細微的抖動變化钩杰。
我們觀察抖音抖動視頻會發(fā)現(xiàn)抠艾,抖動效果的原理是對視頻中的一些幀進行剪切和放大到原圖苛萎,出現(xiàn)視頻中的人或者物體放大顫動的效果,并因為視覺殘留出現(xiàn)閃影效果。
換到OpenCV中進行處理腌歉,就可以分為以下幾個步驟:
- 讀取原視頻蛙酪,設置其抖動的幀數(shù),比如相鄰的9幀的圖像按照圖像中心進行剪裁究履,然后縮放到原來的尺寸
- 設置抖動中不變的幀數(shù)滤否,比如以9幀為間隔來處理圖像
實現(xiàn)抖音視頻抖動
按照原理,我們先讀取視頻最仑,或者直接使用攝像頭藐俺。然后獲取圖像的幀數(shù)FPS,同時獲取圖像的中心Center泥彤,將圖像按比例剪裁20%之后欲芹,在放大至原圖。
下面吟吝,我們來實現(xiàn)視頻抖動效果:
#抖動視頻圖像處理
def video_shake_effect(img):
height, width, n = img.shape
new_img = img[int(height * 0.1):int(height * 0.9), int(width * 0.1):int(width * 0.9)]
new_img = cv2.resize(new_img, (width, height))
return new_img
if __name__ == "__main__":
cap = cv2.VideoCapture("45.mp4")
#獲取視頻幀率菱父,視頻寬度高度,所有通過cv2.CAP_PROP_FPS獲取的參數(shù)都是浮點數(shù)剑逃,而視頻寬高必須為整數(shù)浙宜,所以要進行強制類型轉(zhuǎn)換。
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
i = 1
count = 5
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter("output.avi", fourcc, fps, (width, height))
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
if (i % 5 == 0 or 0 < count < 5):
frame = video_shake_effect(frame)
videoWriter.write(frame)
else:
count = 5
cv2.imshow('video', frame)
videoWriter.write(frame)
i += 1
c = cv2.waitKey(1)
if c == 27:
break
else:
break
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
運行之后蛹磺,效果如下:
output.gif
上圖抖動節(jié)奏有間歇粟瞬,是因為博主將GIF幀率調(diào)小了點,實際情況抖動效果基本一致萤捆。上面程序應該很好理解都是前面博文的知識裙品,這里不在贅述,至于抖動頻率算法俗或,這里是打開視頻先抖動5幀市怎,然后每間隔5幀率抖動一次。