Python+Opencv实战之人脸追踪详解_第1页
Python+Opencv实战之人脸追踪详解_第2页
Python+Opencv实战之人脸追踪详解_第3页
Python+Opencv实战之人脸追踪详解_第4页
Python+Opencv实战之人脸追踪详解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python+Opencv实战之人脸追踪详解目录前言人脸追踪技术简介使用基于dlibDCF的跟踪器进行人脸跟踪使用基于dlibDCF的跟踪器进行对象跟踪小结

前言

人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份、意图和情感;而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用。由于外观变化、遮挡、快速运动、运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性。

人脸追踪技术简介

基于判别相关滤波器(discriminativecorrelationfilter,DCF)的视觉跟踪器具有优异的性能和较高的计算效率,可用于实时应用程序。DCF跟踪器是一种非常流行的基于边界框跟踪的方法。

在dlib库中实现了基于DCF的跟踪器,可以很方便的将其用于对象跟踪。在本文中,我们将介绍如何使用此跟踪器进行人脸和用户选择对象的跟踪,这种方法也称为判别尺度空间跟踪器(DiscriminativeScaleSpaceTracker,DSST),追踪器仅需要输入原始视频和目标初始位置的边界框,然后跟踪器自动预测目标的轨迹。

使用基于dlibDCF的跟踪器进行人脸跟踪

在进行人脸追踪时,我们首先使用dlib人脸检测器进行初始化,然后使用基于dlibDCF的跟踪器DSST进行人脸跟踪。调用以下函数初始化相关跟踪器:

tracker=dlib.correlation_tracker()

这将使用默认值(filter_size=6,num_scale_levels=5,scale_window_size=23,regularizer_space=0.001,nu_space=0.025,regularizer_scale=0.001,nu_scale=0.025,scale_pyramid_alpha=1.020)初始化跟踪器。filter_size和num_scale_levels的值越大,跟踪精度越高,但它需要算力也更大;filter_size的推荐使用值为5、6和7;num_scale_levels的推荐使用值为4、5和6。

使用tracker.start_track()可以开始跟踪。在开始追踪前,我们需要先执行人脸检测,并将检测到的人脸位置传递给这个方法:

iftracking_faceisFalse:

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

#尝试检测人脸以初始化跟踪器

rects=detector(gray,0)

#检查是否检测到人脸

iflen(rects)0:

#开始追踪

tracker.start_track(frame,rects[0])

tracking_face=True

当检测到人脸后,人脸跟踪器将开始跟踪边界框内的内容。为了更新被跟踪对象的位置,需要调用tracker.update()方法:

tracker.update(frame)

tracker.update()方法更新跟踪器并返回衡量跟踪器置信度的指标,此指标可用于使用人脸检测重新初始化跟踪器。

要获取被跟踪对象的位置,需要调用tracker.get_position()方法:

pos=tracker.get_position()

tracker.get_position()方法返回被跟踪对象的位置。最后,绘制人脸的预测位置:

cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(0,255,0),3)

下图中,显示了人脸跟踪算法的跟踪效果过程:

在上图中,可以看到算法当前正在跟踪检测到的人脸,同时还可以按数字1以重新初始化跟踪。

完整代码

完整代码如下所示,同时我们需要提供按下数字1时重新初始化跟踪器的选项。

importcv2

importdlib

defdraw_text_info():

#绘制文本的位置

menu_pos_1=(10,20)

menu_pos_2=(10,40)

#绘制菜单信息

cv2.putText(frame,"Use'1'tore-initializetracking",menu_pos_1,cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255))

iftracking_face:

cv2.putText(frame,"trackingtheface",menu_pos_2,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0))

else:

cv2.putText(frame,"detectingafacetoinitializetracking...",menu_pos_2,cv2.FONT_HERSHEY_SIMPLEX,0.5,

(0,0,255))

#创建视频捕获对象

capture=cv2.VideoCapture(0)

#加载人脸检测器

detector=dlib.get_frontal_face_detector()

#初始化追踪器

tracker=dlib.correlation_tracker()

#当前是否在追踪人脸

tracking_face=False

whileTrue:

#捕获视频帧

ret,frame=capture.read()

#绘制基本信息

draw_text_info()

iftracking_faceisFalse:

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

#尝试检测人脸以初始化跟踪器

rects=detector(gray,0)

#通过判断是否检测到人脸来决定是否启动追踪

iflen(rects)0:

#Starttracking:

tracker.start_track(frame,rects[0])

tracking_face=True

iftracking_faceisTrue:

#更新跟踪器并打印测量跟踪器的置信度

print(tracker.update(frame))

#获取被跟踪对象的位置

pos=tracker.get_position()

#绘制被跟踪对象的位置

cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(0,255,0),3)

#捕获键盘事件

key=0xFFcv2.waitKey(1)

#按1初始化追踪器

ifkey==ord("1"):

tracking_face=False

#按q退出

ifkey==ord('q'):

break

#显示结果

cv2.imshow("Facetrackingusingdlibfrontalfacedetectorandcorrelationfiltersfortracking",frame)

#释放所有资源

capture.release()

cv2.destroyAllWindows()

使用基于dlibDCF的跟踪器进行对象跟踪

除了人脸外,基于dlibDCF的跟踪器可以用于跟踪任意对象。接下来,我们使用鼠标选择要跟踪的对象,并监听键盘事件,如果按1,将开始跟踪预定义边界框内的对象;如果按2,预定义的边界框将被清空,跟踪算法将停止,并等待用户选择另一个边界框。

例如,我们对检测小姐姐并不感兴趣,而更喜欢猫,那么我们可以首先用鼠标绘制矩形框选择喵咪,然后按1开始追踪小猫咪,如果我们想要追踪其他物体,可以按2重新绘制矩形框并进行追踪。如下所示,我们可以看到算法跟踪对象并进行实时输出:

完整代码

完整代码如下所示:

importcv2

importdlib

defdraw_text_info():

#绘制文本的位置

menu_pos_1=(10,20)

menu_pos_2=(10,40)

menu_pos_3=(10,60)

#菜单项

info_1="Useleftclickofthemousetoselecttheobjecttotrack"

info_2="Use'1'tostarttracking,'2'toresettrackingand'q'toexit"

#绘制菜单信息

cv2.putText(frame,"Use'1'tore-initializetracking",menu_pos_1,cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255))

cv2.putText(frame,info_2,menu_pos_2,cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255))

iftracking_state:

cv2.putText(frame,"tracking",menu_pos_3,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0))

else:

cv2.putText(frame,"nottracking",menu_pos_3,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255))

#用于保存要跟踪的对象坐标的结构

points=[]

defmouse_event_handler(event,x,y,flags,param):

#对全局变量的引用

globalpoints

#添加要跟踪的对象的左上角坐标

ifevent==cv2.EVENT_LBUTTONDOWN:

points=[(x,y)]

#添加要跟踪的对象的右下角坐标:

elifevent==cv2.EVENT_LBUTTONUP:

points.append((x,y))

#创建视频捕获对象

capture=cv2.VideoCapture(0)

#窗口名

window_name="Objecttrackingusingdlibcorrelationfilteralgorithm"

#创建窗口

dWindow(window_name)

#绑定鼠标事件

cv2.setMouseCallback(window_name,mouse_event_handler)

#初始化跟踪器

tracker=dlib.correlation_tracker()

tracking_state=False

whileTrue:

#捕获视频帧

ret,frame=capture.read()

#绘制菜单项

draw_text_info()

#设置并绘制一个矩形,跟踪矩形框内的对象

iflen(points)==2:

cv2.rectangle(frame,points[0],points[1],(0,0,255),3)

dlib_rectangle=dlib.rectangle(points[0][0],points[0][1],points[1][0],points[1][1])

iftracking_faceisTrue:

#更新跟踪器并打印测量跟踪器的置信度

print(tracker.update(frame))

#获取被跟踪对象的位置

pos=tracker.get_position()

#绘制被跟踪对象的位置

cv2.rectangle(frame,(int(pos.left()),int(pos.top())),(int(pos.right()),int(pos.bottom())),(0,255,0),3)

#捕获键盘事件

key=0xFFcv2.waitKey(1)

#按下1键,开始追踪

ifkey==or

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论