opencv入门基础(九)基于dlib进行人脸、特定物体追踪

一.人脸追踪

# 1 加入库
import cv2
import dlib
# 2 主函数
def main():
    # 3 打开摄像头
    capture = cv2.VideoCapture(0)
    # 4 基于dlib库获取人脸检测器
    detector = dlib.get_frontal_face_detector()
    # 5 基于dlib库实时跟踪
    tractor = dlib.correlation_tracker()
    # 6 跟踪状态
    tracking_state = False
    # 7 循环读取每一帧
    while True:
        ret, frame = capture.read()
        # 8 如果没有跟踪, 启动跟踪器
        if tracking_state is False:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            dets = detector(gray, 1)  # 返回检测到的人脸
            if len(dets) > 0:  # 判断检测到人脸没有,len(dets)代表人脸数目
                tractor.start_track(frame, dets[0])
                tracking_state = True
        # 9 正在跟踪,实时获取人脸的位置,显示
        if tracking_state is True:
            tractor.update(frame)  # 跟新画面
            position = tractor.get_position()  # 获取人脸的坐标
            cv2.rectangle(frame,(int(position.left()), int(position.top())), (int(position.right()), int(position.bottom())), (0,255,0), 3)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break
        cv2.imshow("face tracking", frame)
    capture.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    main()

运行程序你会发现,电脑的摄像头可以将你的人脸用方框圈住,但是当你用手挡住脸时,再将手拿开,那么锁定框将随着你的手移动,可见基于dilb进行人脸追踪的精度准确性并不是很高,如若想用高精度的算法,那么还需用到深度学习。

二.增加保存视频功能

# 1 加入库
import cv2
import dlib
# 2 主函数
def main():
    # 3 打开摄像头
    capture = cv2.VideoCapture(0)
    # 4 基于dlib库获取人脸检测器
    detector = dlib.get_frontal_face_detector()
    # 5 基于dlib库实时跟踪
    tractor = dlib.correlation_tracker()
    # 6 跟踪状态
    tracking_state = False
    # 增加功能一:保存视频
    frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
    frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
    frame_fps = capture.get(cv2.CAP_PROP_FPS)
    # 设置视频格式
    fourcc = cv2.VideoWriter_fourcc(*"XVID")
    # 设置输出格式
    output = cv2.VideoWriter("record.avi", fourcc, int(frame_fps), (int(frame_width), int(frame_height)), True)
    # 7 循环读取每一帧
    while True:
        ret, frame = capture.read()
        # 8 如果没有跟踪, 启动跟踪器
        if tracking_state is False:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            dets = detector(gray, 1)  # 返回检测到的人脸
            if len(dets) > 0:  # 判断检测到人脸没有,len(dets)代表人脸数目
                tractor.start_track(frame, dets[0])
                tracking_state = True
        # 9 正在跟踪,实时获取人脸的位置,显示
        if tracking_state is True:
            tractor.update(frame)  # 跟新画面
            position = tractor.get_position()  # 获取人脸的坐标
            cv2.rectangle(frame,(int(position.left()), int(position.top())), (int(position.right()), int(position.bottom())), (0,255,0), 3)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break
        cv2.imshow("face tracking", frame)
        # 保存视频
        output.write(frame)
    capture.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    main()

当你按下q键退出时,会把刚才运行时的视频以record.avi为名字,保存在当前目录下。

三.增加reset功能和信息提示功能

# 1 加入库
import cv2
import dlib
# 增加功能二:信息提示
def show_info(frame, tracking_state):
    pos1 = (20, 40)  # 提示信息显示位置
    pos2 = (20, 80)  # 提示信息显示位置
    cv2.putText(frame, "'1' : reset ", pos1, cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255))
    # 根据状态,显示不同的信息
    if tracking_state is True:
        cv2.putText(frame, "tracking now ...", pos2, cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 0, 0))
    else:
        cv2.putText(frame, "no tracking ...", pos2, cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 255, 0))
# 2 主函数
def main():
    # 3 打开摄像头
    capture = cv2.VideoCapture(0)
    # 4 基于dlib库获取人脸检测器
    detector = dlib.get_frontal_face_detector()
    # 5 基于dlib库实时跟踪
    tractor = dlib.correlation_tracker()
    # 6 跟踪状态
    tracking_state = False
    # 7 循环读取每一帧
    while True:
        ret, frame = capture.read()
        # 显示提示信息
        show_info(frame, tracking_state)
        # 8 如果没有跟踪, 启动跟踪器
        if tracking_state is False:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            dets = detector(gray, 1) # 返回检测到的人脸
            if len(dets) > 0:
                tractor.start_track(frame, dets[0])
                tracking_state = True
        # 9 正在跟踪,实时获取人脸的位置,显示
        if tracking_state is True:
            tractor.update(frame) # 跟新画面
            position = tractor.get_position() # 获取人脸的坐标
            cv2.rectangle(frame,(int(position.left()), int(position.top())), (int(position.right()), int(position.bottom())), (0,255,0), 3)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break
        if key == ord('1'):
            tracking_state = False
        cv2.imshow("face tracking", frame)
    capture.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    main()

在左上角出现了提示信息:

opencv lstm跟踪 opencv人物追踪_python

四.基于dlib进行目标跟踪

这一部分实现的功能为,划定一个特定的物体,让摄像头对其进行跟踪。

import cv2
import dlib
# 定义方法:显示信息
def show_info():
    pos1 = (10,20)
    pos2 = (10,40)
    pos3 = (10,60)
    info1 = "put left button,select an area,start tracking"
    info2 = "'1':start tracking,'2':stop tracking,'q':exit"
    cv2.putText(frame,info1,pos1,cv2.FONT_HERSHEY_COMPLEX,0.5,(255,255,255))
    cv2.putText(frame,info2,pos2,cv2.FONT_HERSHEY_COMPLEX,0.5,(255,255,255))
    if tracking_state is True:
        cv2.putText(frame,"tracking now",pos3,cv2.FONT_HERSHEY_COMPLEX,0.5,(255,0,0))
    else:
        cv2.putText(frame, "stop tracking", pos3, cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,0,0))
# 存放鼠标点击事件的坐标点
points = []
# 定义方法:鼠标点击的事件
def mouse_event_handler(event,x,y,flags,parms):  # flags,parms不用管,但缺少会报错
    global points  # 全局调用,要用的列表中的参数
    if event == cv2.EVENT_LBUTTONDOWN:  # 鼠标左键按下
        points = [(x,y)]
    elif event == cv2.EVENT_LBUTTONUP:  # 鼠标左键松开
        points.append((x,y))
# 打开摄像头
capture = cv2.VideoCapture(0)
# 设定窗口名称
nameWindow = "Object Tracking"
# 将鼠标事件绑定到窗口上去
cv2.namedWindow(nameWindow)
cv2.setMouseCallback(nameWindow , mouse_event_handler)
# 启动追踪器dlib.correlation_tracker()
tracker = dlib.correlation_tracker()
# 假设跟踪状态
tracking_state = False
# 循环读取视频流
while True:
  # 获取每一帧
  ret,frame = capture.read()
  # 显示提示信息
  show_info()
  # 如果获取到的坐标点是两个,那么就绘制出矩形框,以及也要让dlib的rectangle()知道坐标在哪里
  if len(points) == 2:
      cv2.rectangle(frame,points[0],points[1],(0,255,0),3)  # point[0]:(x,y),point[1]:(x,y)元组类型
      dlib_rect = dlib.rectangle(points[0][0],points[0][1],points[1][0],points[1][1])
  # 判断:如果跟踪状态为true,那么,更新跟踪,获取位置,绘制矩形框
  if tracking_state is True:
      tracker.update(frame)  # 更新画面
      pos = tracker.get_position()  # 获取坐标
      cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(255,0,0),3)

  # 事件判断,根据按键:1、2、3、4
  key = cv2.waitKey(1) & 0xFF

  if key == ord('1'):  # 开始追踪
      if len(points) == 2:
          tracker.start_track(frame,dlib_rect)
          tracking_state = True
          points = []  # 重启之后就要重新框选了
  if key == ord('2'):  # 重置
        points = []
        tracking_state = False
  if key == ord('q'):  # 退出
        break
  # 显示整体效果
  cv2.imshow(nameWindow,frame)
capture.release()
cv2.destroyAllWindows()

鼠标框选后按1进行追踪,按2退出跟踪重新选定,按q则退出程序

opencv lstm跟踪 opencv人物追踪_opencv_02