Python+Opencv實戰(zhàn)之人臉追蹤詳解_第1頁
Python+Opencv實戰(zhàn)之人臉追蹤詳解_第2頁
Python+Opencv實戰(zhàn)之人臉追蹤詳解_第3頁
Python+Opencv實戰(zhàn)之人臉追蹤詳解_第4頁
Python+Opencv實戰(zhàn)之人臉追蹤詳解_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第Python+Opencv實戰(zhàn)之人臉追蹤詳解目錄前言人臉追蹤技術簡介使用基于dlibDCF的跟蹤器進行人臉跟蹤使用基于dlibDCF的跟蹤器進行對象跟蹤小結

前言

人臉處理是人工智能中的一個熱門話題,人臉處理可以使用計算機視覺算法從人臉中自動提取大量信息,例如身份、意圖和情感;而目標跟蹤試圖估計目標在整個視頻序列中的軌跡,其中只有目標的初始位置是已知的,將這兩者進行結合將產(chǎn)生許多有趣的應用。由于外觀變化、遮擋、快速運動、運動模糊和比例變化等多種因素,人臉追蹤非常具有挑戰(zhàn)性。

人臉追蹤技術簡介

基于判別相關濾波器(discriminativecorrelationfilter,DCF)的視覺跟蹤器具有優(yōu)異的性能和較高的計算效率,可用于實時應用程序。DCF跟蹤器是一種非常流行的基于邊界框跟蹤的方法。

在dlib庫中實現(xiàn)了基于DCF的跟蹤器,可以很方便的將其用于對象跟蹤。在本文中,我們將介紹如何使用此跟蹤器進行人臉和用戶選擇對象的跟蹤,這種方法也稱為判別尺度空間跟蹤器(DiscriminativeScaleSpaceTracker,DSST),追蹤器僅需要輸入原始視頻和目標初始位置的邊界框,然后跟蹤器自動預測目標的軌跡。

使用基于dlibDCF的跟蹤器進行人臉跟蹤

在進行人臉追蹤時,我們首先使用dlib人臉檢測器進行初始化,然后使用基于dlibDCF的跟蹤器DSST進行人臉跟蹤。調用以下函數(shù)初始化相關跟蹤器:

tracker=dlib.correlation_tracker()

這將使用默認值(filter_size=6,num_scale_levels=5,scale_window_size=23,regularizer_space=0.001,nu_space=0.025,regularizer_scale=0.001,nu_scale=0.025,scale_pyramid_alpha=1.020)初始化跟蹤器。filter_size和num_scale_levels的值越大,跟蹤精度越高,但它需要算力也更大;filter_size的推薦使用值為5、6和7;num_scale_levels的推薦使用值為4、5和6。

使用tracker.start_track()可以開始跟蹤。在開始追蹤前,我們需要先執(zhí)行人臉檢測,并將檢測到的人臉位置傳遞給這個方法:

iftracking_faceisFalse:

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

#嘗試檢測人臉以初始化跟蹤器

rects=detector(gray,0)

#檢查是否檢測到人臉

iflen(rects)0:

#開始追蹤

tracker.start_track(frame,rects[0])

tracking_face=True

當檢測到人臉后,人臉跟蹤器將開始跟蹤邊界框內(nèi)的內(nèi)容。為了更新被跟蹤對象的位置,需要調用tracker.update()方法:

tracker.update(frame)

tracker.update()方法更新跟蹤器并返回衡量跟蹤器置信度的指標,此指標可用于使用人臉檢測重新初始化跟蹤器。

要獲取被跟蹤對象的位置,需要調用tracker.get_position()方法:

pos=tracker.get_position()

tracker.get_position()方法返回被跟蹤對象的位置。最后,繪制人臉的預測位置:

cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(0,255,0),3)

下圖中,顯示了人臉跟蹤算法的跟蹤效果過程:

在上圖中,可以看到算法當前正在跟蹤檢測到的人臉,同時還可以按數(shù)字1以重新初始化跟蹤。

完整代碼

完整代碼如下所示,同時我們需要提供按下數(shù)字1時重新初始化跟蹤器的選項。

importcv2

importdlib

defdraw_text_info():

#繪制文本的位置

menu_pos_1=(10,20)

menu_pos_2=(10,40)

#繪制菜單信息

cv2.putText(frame,"Use'1'tore-initializetracking",menu_pos_1,cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255))

iftracking_face:

cv2.putText(frame,"trackingtheface",menu_pos_2,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0))

else:

cv2.putText(frame,"detectingafacetoinitializetracking...",menu_pos_2,cv2.FONT_HERSHEY_SIMPLEX,0.5,

(0,0,255))

#創(chuàng)建視頻捕獲對象

capture=cv2.VideoCapture(0)

#加載人臉檢測器

detector=dlib.get_frontal_face_detector()

#初始化追蹤器

tracker=dlib.correlation_tracker()

#當前是否在追蹤人臉

tracking_face=False

whileTrue:

#捕獲視頻幀

ret,frame=capture.read()

#繪制基本信息

draw_text_info()

iftracking_faceisFalse:

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

#嘗試檢測人臉以初始化跟蹤器

rects=detector(gray,0)

#通過判斷是否檢測到人臉來決定是否啟動追蹤

iflen(rects)0:

#Starttracking:

tracker.start_track(frame,rects[0])

tracking_face=True

iftracking_faceisTrue:

#更新跟蹤器并打印測量跟蹤器的置信度

print(tracker.update(frame))

#獲取被跟蹤對象的位置

pos=tracker.get_position()

#繪制被跟蹤對象的位置

cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(0,255,0),3)

#捕獲鍵盤事件

key=0xFFcv2.waitKey(1)

#按1初始化追蹤器

ifkey==ord("1"):

tracking_face=False

#按q退出

ifkey==ord('q'):

break

#顯示結果

cv2.imshow("Facetrackingusingdlibfrontalfacedetectorandcorrelationfiltersfortracking",frame)

#釋放所有資源

capture.release()

cv2.destroyAllWindows()

使用基于dlibDCF的跟蹤器進行對象跟蹤

除了人臉外,基于dlibDCF的跟蹤器可以用于跟蹤任意對象。接下來,我們使用鼠標選擇要跟蹤的對象,并監(jiān)聽鍵盤事件,如果按1,將開始跟蹤預定義邊界框內(nèi)的對象;如果按2,預定義的邊界框將被清空,跟蹤算法將停止,并等待用戶選擇另一個邊界框。

例如,我們對檢測小姐姐并不感興趣,而更喜歡貓,那么我們可以首先用鼠標繪制矩形框選擇喵咪,然后按1開始追蹤小貓咪,如果我們想要追蹤其他物體,可以按2重新繪制矩形框并進行追蹤。如下所示,我們可以看到算法跟蹤對象并進行實時輸出:

完整代碼

完整代碼如下所示:

importcv2

importdlib

defdraw_text_info():

#繪制文本的位置

menu_pos_1=(10,20)

menu_pos_2=(10,40)

menu_pos_3=(10,60)

#菜單項

info_1="Useleftclickofthemousetoselecttheobjecttotrack"

info_2="Use'1'tostarttracking,'2'toresettrackingand'q'toexit"

#繪制菜單信息

cv2.putText(frame,"Use'1'tore-initializetracking",menu_pos_1,cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255))

cv2.putText(frame,info_2,menu_pos_2,cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255))

iftracking_state:

cv2.putText(frame,"tracking",menu_pos_3,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0))

else:

cv2.putText(frame,"nottracking",menu_pos_3,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255))

#用于保存要跟蹤的對象坐標的結構

points=[]

defmouse_event_handler(event,x,y,flags,param):

#對全局變量的引用

globalpoints

#添加要跟蹤的對象的左上角坐標

ifevent==cv2.EVENT_LBUTTONDOWN:

points=[(x,y)]

#添加要跟蹤的對象的右下角坐標:

elifevent==cv2.EVENT_LBUTTONUP:

points.append((x,y))

#創(chuàng)建視頻捕獲對象

capture=cv2.VideoCapture(0)

#窗口名

window_name="Objecttrackingusingdlibcorrelationfilteralgorithm"

#創(chuàng)建窗口

dWindow(window_name)

#綁定鼠標事件

cv2.setMouseCallback(window_name,mouse_event_handler)

#初始化跟蹤器

tracker=dlib.correlation_tracker()

tracking_state=False

whileTrue:

#捕獲視頻幀

ret,frame=capture.read()

#繪制菜單項

draw_text_info()

#設置并繪制一個矩形,跟蹤矩形框內(nèi)的對象

iflen(points)==2:

cv2.rectangle(frame,points[0],points[1],(0,0,255),3)

dlib_rectangle=dlib.rectangle(points[0][0],points[0][1],points[1][0],points[1][1])

iftracking_faceisTrue:

#更新跟蹤器并打印測量跟蹤器的置信度

print(tracker.update(frame))

#獲取被跟蹤對象的位置

pos=tracker.get_position()

#繪制被跟蹤對象的位置

cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(0,255,0),3)

#捕獲鍵盤事件

key=0xFFcv2.waitKey(1)

#按下1鍵,開始追蹤

ifkey==or

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論