1. 程式人生 > >ubuntu下利用Dlib實現目標跟蹤(上)

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

Dlib官網上是有很詳細的Dlib函式使用介紹的,因為我現階段主要用Python呼叫它,所以只看官網上的Examples: PythonPython API

這裡寫圖片描述

本文主要用到的時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