ubuntu下利用Dlib實現目標跟蹤(上)
本文將介紹在Ubuntu下利用python來呼叫Dlib和opencv,來實現目標跟蹤。
opencv是計算機視覺界最常用的庫,而至於Dlib在本人《Windows下利用dlib19.2實現多目標追蹤 》博文中也提到過。Dlib是一個很好用的開源C ++工具包,其中包含很多機器學習以及其他演算法。 它被廣泛應用於行業和學術領域,包括機器人,嵌入式裝置,行動電話和大型高效能運算環境。而且它還有python介面,這使得它簡直就是我這種C++程式設計能力比較弱渣渣的福音(PS:C++還是要好好學的!本人在此立flag!!!)。
環境配置
- 系統:ubuntu16.04.2
- opencv3.2.0(Ubuntu下opencv的安裝如果有疑問,參見我《Ubuntu16.04 OpenCV安裝筆記 》一文)
- Dlib19.4(下載地址http://dlib.net/files/dlib-19.4.tar.bz2)
ubuntu下Dlib的安裝參見它原始碼根目錄下的“README.md”,介紹得比較詳細,無非也就是Cmake->make->make install……,唯一一點就是要安裝它的python介面,安裝完後,開啟python,import dlib 沒錯就說明OK了。
Dlib
本文主要用到的時Python API中的dlib.correlation_tracker類,裡面有關於各個函式的詳細介紹。
目標跟蹤
先貼程式碼,看效果:
import osimport globimport cv2import dlib# Path to the video framesvideo_folder = os.path.join("..", "examples", "video_frames" )# Create the correlation tracker - the object needs to be initialized before it can be usedtracker = dlib.correlation_tracker()selection = Nonetrack_window = Nonedrag_start = Nonedef onmouse(event, x, y, flags, param): global selection,track_window,drag_start if event == cv2.EVENT_LBUTTONDOWN: drag_start = (x, y) track_window = None if drag_start: xmin = min(x, drag_start[0]) ymin = min(y, drag_start[1]) xmax = max(x, drag_start[0]) ymax = max(y, drag_start[1]) selection = (xmin, ymin, xmax, ymax) if event == cv2.EVENT_LBUTTONUP: drag_start = None track_window = selection selection = Nonedef main(): cv2.namedWindow('image',1) cv2.setMouseCallback('image',onmouse) # We will track the frames as we load them off of disk for k, f in enumerate(sorted(glob.glob(os.path.join(video_folder, "*.jpg")))): print("Processing Frame {}".format(k)) img_raw = cv2.imread(f) image = img_raw.copy() # We need to initialize the tracker on the first frame if k == 0: # Start a track on the object you want. box the object using the mouse and press 'Enter' to start tracking while True: img_first = image.copy() if track_window: cv2.rectangle(img_first,(track_window[0],track_window[1]),(track_window[2],track_window[3]),(0,0,255),1) elif selection: cv2.rectangle(img_first,(selection[0],selection[1]),(selection[2],selection[3]),(0,0,255),1) cv2.imshow('image',img_first) if cv2.waitKey(10) == 10: break tracker.start_track(image, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3])) else: # Else we just attempt to track from the previous frame tracker.update(image) # Get previous box and draw on showing image box_predict = tracker.get_position() cv2.rectangle(image,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,0,255),1) cv2.imshow('image',image) cv2.waitKey(10) cv2.destroyAllWindows()if __name__ == '__main__': main()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
該py檔案放在dlib-19.4/python_examples中,視訊檔案(其實是每幀的圖片)在dlib-19.4/examples/video_frames中。
- 程式執行後,會顯示出第一幀,用滑鼠框一個要跟蹤的物體:
- 框好後按回車進行跟蹤:
程式碼分析
用opencv的滑鼠GUI操作來在第一幀框住要跟蹤的目標,這隻需要在顯示框上設定一個回撥函式,來返回滑鼠框到的框的座標。
根據框好的框確定要跟蹤的目標物體,並傳入tracker.start_track中。
按回車進行跟蹤 ,之後用tracker.update(image)來追蹤當前幀。tracker.get_position()返回追蹤到的框,但要注意的是返回的這個框的資料型別時Dlib中的drectangle,不能直接傳給我們顯示所用的Opencv函式,所以我們通過drectangle操作函式來將框的座標資訊讀出來(關於dlib.drectangle,詳細資訊去Python API中查)。
最後根據跟蹤得到的框在圖片顯示時框出來就好了。
總結一下,使用 dlib.correlation_tracker分四步:
1. 用dlib.correlation_tracker()建立一個跟蹤類
2. start_track中設定圖片中的要跟蹤物體的框
3. update()中輸入要跟蹤的下一幀圖片
4. get_position()得到跟蹤到的目標在新一幀中框的位置
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow