抖音視頻抖動原理
感興趣的不妨隨便弄一個視頻使用抖音抖動效果觀察。這里,博主建議讀者使用國際象棋的視頻圖像,這種方塊的格式更能看清細微的抖動變化。
我們觀察抖音抖動視頻會發(fā)現(xiàn),抖動效果的原理是對視頻中的一些幀進行剪切和放大到原圖,出現(xiàn)視頻中的人或者物體放大顫動的效果,并因為視覺殘留出現(xiàn)閃影效果。
換到OpenCV中進行處理,就可以分為以下幾個步驟:
- 讀取原視頻,設(shè)置其抖動的幀數(shù),比如相鄰的9幀的圖像按照圖像中心進行剪裁,然后縮放到原來的尺寸
- 設(shè)置抖動中不變的幀數(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)小了點,實際情況抖動效果基本一致。上面程序應(yīng)該很好理解都是前面博文的知識,這里不在贅述,至于抖動頻率算法,這里是打開視頻先抖動5幀,然后每間隔5幀率抖動一次。