今天就來看一下人臉辨識 + 物件追蹤可以迸出什麼樣的火花吧!
applications
目錄下新增face_tracking
目錄與main.py
檔案main.py
:
import ntpath
import sys
# resolve module import error in PyCharm
sys.path.append(ntpath.dirname(ntpath.dirname(ntpath.dirname(ntpath.abspath(__file__)))))
import argparse
import time
import cv2
from imutils.video import WebcamVideoStream, FPS
from face_detection.dlib_mmod import detect
# 初始化OpenCV提供的追蹤方法列表
OPENCV_OBJECT_TRACKERS = {
# 更準確但比kcf慢
"csrt": cv2.TrackerCSRT_create,
# 速度與準確兼備
"kcf": cv2.TrackerKCF_create,
"boosting": cv2.TrackerBoosting_create,
"mil": cv2.TrackerMIL_create,
"tld": cv2.TrackerTLD_create,
"medianflow": cv2.TrackerMedianFlow_create,
# 更快但比kcf不準
"mosse": cv2.TrackerMOSSE_create
}
def main():
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--tracker", type=str,
default="kcf",
choices=["csrt", "kcf", "boosting", "mil", "tld", "medianflow", "mosse"],
help="the object tracker type")
args = vars(ap.parse_args())
# 初始化object tracker
trackers = cv2.MultiTracker_create()
# 啟動WebCam
vs = WebcamVideoStream().start()
time.sleep(2.0)
fps = FPS().start()
initFace = False
while True:
# 取得當前的frame
frame = vs.read()
# 使用dlib: MMOD來偵測人臉並追蹤
if not initFace:
rects = detect(frame)
for rect in rects:
print(rect)
tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
trackers.add(tracker, frame, rect)
initFace = True
# 物件追蹤更新
(_, boxes) = trackers.update(frame)
# 偵測物件位置與畫圖
if len(boxes) > 0:
for box in boxes:
(x, y, w, h) = [int(b) for b in box]
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
fps.update()
fps.stop()
cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()), (10, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
cv2.imshow("frame", frame)
key = cv2.waitKey(1) & 0xff
# 你也可以用判斷是否需要圈選物件 (按下c按鍵)
if key == ord('c'):
# 圈選矩形框 (需按下空白鍵或Enter確認)
box = cv2.selectROI("frame", frame, fromCenter=False, showCrosshair=True)
print(box)
tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
trackers.add(tracker, frame, box)
fps = FPS().start()
# 按下q鍵就離開程式
elif key == ord('q'):
break
vs.stop()
fps.stop()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
face_tracking
目錄下與輸入python main.py
:程式碼部分應該很好理解,
我們把前面的人臉追蹤功能,
與cv2.tracker
相關的邏輯合併在一起就完成今天的應用了。
你也可以透過按下
c
按鍵拉矩形範圍與space
空白鍵確認,來新增一個tracker追蹤物件
.
.
電腦視覺的世界還有很多問題需要克服,
但到目前也已經有很多的進展,
可以讓我們盡情地去發想各式各樣的應用。
期待你經過這個系列能對這個領域有些些的理解與幫助,
也期待在未來能看到你做出專屬於自己的應用。
系列的原始碼參考