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()
在左上角出现了提示信息:
四.基于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则退出程序