Python相位光流(Phase-Based Optical Flow)是一種流暢視頻圖像處理技術(shù),通過分析視頻中連續(xù)圖像的相位差異,獲取視頻中對象的運動軌跡。Python語言提供了豐富的圖像處理庫來實現(xiàn)相位光流,下面我們來看一下具體實現(xiàn)。
import cv2 import numpy as np video = cv2.VideoCapture("video.mp4") #導(dǎo)入視頻 ret, frame1 = video.read() #讀取第一幀圖像 gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)為灰度圖 while True: ret, frame2 = video.read() #讀取下一幀圖像 gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)為灰度圖 flow = cv2.calcOpticalFlowFarneback( gray1, gray2, None, 0.5, 3, 15, 3, 5, 1.2, 0) #獲取光流矢量,F(xiàn)arneback是一種基于多尺度的光流估計方法 magnitude, angle = cv2.cartToPolar( flow[...,0], flow[...,1]) #轉(zhuǎn)換為極坐標自變量 hsv = np.zeros_like(frame1) #創(chuàng)建一個像素值與frame1相同的空白圖像 hsv[...,1] = 255 hsv[...,0] = angle*180/np.pi/2 hsv[...,2] = cv2.normalize(magnitude,None,0,255,cv2.NORM_MINMAX) #歸一化光流強度 bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) #將hsv圖像轉(zhuǎn)為rgb圖像 cv2.imshow('frame2',bgr) if cv2.waitKey(1) == ord('q'): break gray1 = gray2 video.release() #釋放視頻資源 cv2.destroyAllWindows()
通過以上代碼,我們可以得到視頻中連續(xù)兩幀圖像的光流矢量,可以進一步判斷對象的運動軌跡,實現(xiàn)目標跟蹤、運動分析等應(yīng)用。