[Day 30] 应用三:脸部追踪

今天就来看一下人脸辨识 + 物件追踪可以迸出什麽样的火花吧!

本文开始

  1. applications目录下新增face_tracking目录与main.py档案
  2. 开启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()
    
    
  3. 开启terminal,切换到face_tracking目录下与输入python main.py

tracking


程序码部分应该很好理解,

我们把前面的人脸追踪功能,

cv2.tracker相关的逻辑合并在一起就完成今天的应用了。

你也可以透过按下c按键拉矩形范围与space空白键确认,来新增一个tracker追踪物件

.

.

电脑视觉的世界还有很多问题需要克服,

但到目前也已经有很多的进展,

可以让我们尽情地去发想各式各样的应用。

期待你经过这个系列能对这个领域有些些的理解与帮助,

也期待在未来能看到你做出专属於自己的应用。

系列的原始码参考


<<:  [NestJS 带你飞!] DAY28 - CORS

>>:  Android Studio初学笔记-Day28-Fragment

Day06 - 随意玩之 OrderQuery/OrderPayQuery

昨天介绍了 OrderCreate,今天会把另外两个都介绍完! OrderQuery 主要功能:查询...

ASP.NET MVC 从入门到放弃(Day12) -Class funtion return void 函式写法

接着来讲讲Class一些基本概念.... 我顺序有点搞错...这个要放在物件导向前面讲的才对 1.X...

如何快速上手第三方套件

在现在这种讲求快速开发的开发模式,我们通常不太会自己将所有功能都自己硬刻出来,而是会去使用第三方的套...

找LeetCode上简单的题目来撑过30天啦(DAY20)

这题写凌晨2、3点,本来要用c的,最後用JAVA,然後睡觉前送出去Time Limit Exceed...

Golang 转生到web世界 - template

Golang 玩一下html template 如果golang要使用作为网站的话,不太可能都只靠p...