https://github.com/inayatkh/tracking-python3
python3.6.1
pycharm社区版
opencv-contrib-python3.4.1.15
# import the required packages
from imutils.video import WebcamVideoStream # 从imutils库中导入WebcamVideoStream模块
from imutils.video import VideoStream # 从imutils库中导入VideoStream模块
import numpy as np # 导入numpy库并简写为np
import argparse # 导入argparse库,用于解析命令行参数
import imutils # 导入imutils库
import time # 导入time库
import cv2 # 导入OpenCV库
import dlib # 导入dlib库
from utils.fps2 import FPS2 # 从自定义的utils文件夹中导入fps2模块的FPS2类
if __name__ == '__main__':
# 初始化参数解析器
ap = argparse.ArgumentParser()
# 添加参数 --type,表示选择跟踪器的类型,范围是[0..5],对应['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
ap.add_argument("-t", "--type", required=True, help="input from [0..5] for selection of type of tracker from ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN'] ")
# 解析参数
args = vars(ap.parse_args())
# 打印选择的跟踪器类型
print("[info] tracker selected is ", args["type"])
# 从OpenCV3.2中获取可用的跟踪器类型
trackerTypes = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
# 获取选择的跟踪器类型
trackerType = trackerTypes[int(args["type"])]
# 用选择的跟踪器类型初始化OpenCV跟踪器,MIL可以修改
trackerOpenCV = cv2.Tracker("MIL")
# 用dlib检测器初始化跟踪器
# 初始化dlib人脸检测器
frontFaceDetector = dlib.get_frontal_face_detector()
# 初始化标记,以便只初始化跟踪器一次
initOnce = False
# 打印信息:开始读取网络摄像头
print("[info] starting to read a video ...")
# 开启网络摄像头
#capWebCam = WebcamVideoStream(0).start()
cap = VideoStream('my_video_file.mp4').start()#前后文用到capWebCam变量的地方也要相应改成
# 等待1秒钟,确保摄像头已启动
time.sleep(3.0)
# 启动FPS计数器
#fps = FPS2().start()
# 循环遍历从网络摄像头获取的每一帧
#这段代码是一个实时人脸追踪器,可以使用不同的追踪器(例如OpenCV的BOOSTING、MIL、KCF、TLD、MEDIANFLOW和CSRT)。
#代码通过从摄像头读取每一帧图像来实时检测人脸,并在检测到人脸时初始化一个追踪器,然后使用该追踪器跟踪人脸。
#如果跟踪成功,则在帧中绘制一个矩形框来标识人脸的位置;否则,显示追踪失败的信息。
#代码使用OpenCV库和dlib库来实现人脸检测和追踪。此外,代码还会显示每秒钟的帧率,并在窗口的标题中显示使用的追踪器类型。
#最后,当用户按下"ESC"键时,程序将停止,并显示运行时间和平均帧率。
while True:
# 从线程流中获取每一帧,将其缩放并转换为灰度图像(同时仍保留3个通道)。
frame1 = cap.read()#从视频流中读取一帧图像,将它存储在变量 frame1 中
frame = cv2.flip(frame1,1)#对读取的图像进行左右镜像翻转,这个操作可以用来调整图像的方向。
#frame = imutils.resize(frame, width=450)#对图像进行缩放,将它的宽度调整为450个像素。这个操作可以用来调整图像的大小。
#frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#缩放后的图像转换为灰度图像
#frame = np.dstack([frame, frame, frame])这个操作可以用来将灰度图像显示为彩色图像,方便观察和处理。np.dstack 函数可以将三个灰度图像数组按照通道的方式合并成一个三通道的彩色图像数组。在这里,由于灰度图像只有一个通道,所以使用三个相同的灰度图像来构造一个三通道的彩色图像。
# 在帧上显示队列的大小。
#cv2.putText(frame, "Queue Size: {}".format(fvs.Q.qsize()),
# (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
#
#这段代码中的 "if not initOnce" 句子意思是如果变量 "initOnce" 的值为 False 或者未被定义,那么条件成立。通常情况下,这个条件用于在程序的第一次运行时执行一些初始化的操作。在第一次执行后,变量 "initOnce" 的值会被设置为 True,以防止重复执行初始化操作。如果 "initOnce" 变量已经被定义并且它的值为 True,那么这个条件不成立,程序就会跳过这个代码块,执行其他的逻辑。
if not initOnce:# 如果初始化完成
faceRect = frontFaceDetector(frame, 0)# 使用人脸检测器检测人脸,并返回人脸位置
if(len(faceRect) == 0):# 如果没有检测到人脸,则跳过
continue
# start the frame per second (FPS) counter
fps = FPS2().start()# 开始计算帧率
bbox = faceRect[0]# 获取检测到的第一个人脸的位置信息
print(bbox)
# convert dlib rect to opencv rect# 将人脸位置信息转换为 OpenCV 格式
curFaceBbox = (int(bbox.left()), int(bbox.top()), int(bbox.right() - bbox.left()),
int(bbox.bottom() - bbox.top()) )
# intialize the Tracker
#curFaceBbox = cv2.selectROI("tracking", frame)
success = trackerOpenCV.init(frame, curFaceBbox)# 初始化跟踪器
initOnce = True# 初始化完成
#continue
#在最后一行添加 continue 语句将跳过当前帧,进入下一次循环,不会执行后面的代码。这会导致初始化跟踪器的代码块被跳过,直接进入下一个循环,继续检测下一帧的人脸。也就是说,跟踪器没有被正确初始化,无法进行跟踪任务。
#因此,如果在最后一行添加 continue 语句,程序可能无法正确初始化跟踪器,导致跟踪失败或不准确。而不添加 continue 语句,则会在当前帧中执行初始化跟踪器的代码块,确保跟踪器被正确初始化,从而实现更好的跟踪效果。
# Update tracker
success, curFaceBbox = trackerOpenCV.update(frame) # 使用跟踪器更新人脸位置信息
print(success, curFaceBbox)
if success:# 如果跟踪成功
# Tracking success
topLeft = (int(curFaceBbox[0]), int(curFaceBbox[1])) # 获取人脸矩形框左上角的坐标
bottomRight = (int(curFaceBbox[0] + curFaceBbox[2]), int(curFaceBbox[1] + curFaceBbox[3]))# 获取人脸矩形框右下角的坐标
cv2.rectangle(frame, topLeft,bottomRight, (255,0,0), 2,1 )# 在原图中绘制人脸矩形框
else:# 在原图中显示跟踪失败的提示信息
# Tracking failure
cv2.putText(frame, trackerType + " Tracking failure detected", (20,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)# 在原图中显示跟踪失败的提示信息
fps.update()# 更新帧率
cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()),
(10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)# 在原图中显示帧率信息
cv2.putText(frame, trackerType + " Tracker", (20,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)# 显示跟踪结果
# show the frame and update the FPS counter显示帧并更新帧率计数器
cv2.imshow("OpenCV Tracking by " + trackerType, frame)#会显示一个名为"OpenCV Tracking by " + trackerType的窗口,并在该窗口中显示名为frame的图像或视频帧
k = cv2.waitKey(10) & 0xff# 等待按键输入
if k == 27:
break# 如果按下 ESC 键,则退出循环
# stop the timer and display FPS information
fps.stop()# 停止计算帧率
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))# 输出经过的时间
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
# do a bit of cleanup
cv2.destroyAllWindows()
cap.stop()
if __name__ == '__main__':
是一个Python中的惯用语,它用于判断当前脚本是否是直接被运行,而不是被导入到其他模块中。
当 Python 解释器读取一个 .py 文件时,会把这个文件的特殊属性 name 赋值为 'main'。如果当前脚本是被直接运行的,那么 name 就等于 'main',于是这个条件就成立了,执行下面的代码块。
如果当前脚本是被其他脚本导入的,那么 name 就等于其他脚本的文件名,这个条件就不成立,下面的代码块就不会执行。这种方式可以避免一些代码不必要的重复执行,也可以方便地将一个脚本作为模块导入到其他程序中使用。
cv2.putText(frame, "Queue Size: {}".format(fvs.Q.qsize()), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
这段代码是用来在图像帧上绘制文本信息的。具体来说,这个函数调用的含义如下:
cv2.putText
:OpenCV 提供的一个函数,用来在图像上绘制文本信息。
frame
:需要绘制文本的图像帧。
"Queue Size: {}".format(fvs.Q.qsize())
:要绘制的文本信息,包括队列的大小。{}
用来表示一个占位符,.format()
函数用来填充这个占位符。fvs.Q.qsize()
表示获取队列的大小,它是由 fvs
对象中的 Queue
属性维护的。
(10, 30)
:文本信息的位置,即文本框左上角的坐标。
cv2.FONT_HERSHEY_SIMPLEX
:文本字体的类型,这里使用的是简单正常大小的字体。
0.6
:文本的字体大小。
(0, 255, 0)
:文本的颜色,这里是绿色。
2
:文本的线宽,即绘制文本的线的宽度。
--type "3"
cap = VideoStream("F:\pycharm_python\projects\tracking-python3-master\videos\boy-walking.mp4").start()
Traceback (most recent call last):
File "F:\pycharm_python\projects\tracking-python3-master\trackeOneObject.py", line 77, in
faceRect = frontFaceDetector(frame, 0)
RuntimeError: Unsupported image type, must be 8bit gray or RGB image.
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:834)
warning: F:\pycharm_python\projects racking-python3-masterideooy-walking.mp4 (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:835)
问了下ChatGPT这么改。人家说:
这个报错信息提供了两个错误:
RuntimeError: Unsupported image type, must be 8bit gray or RGB image. 这个错误表示在调用frontFaceDetector函数时,传递的图像格式不支持,它要求图像是8位灰度或RGB格式。可能是图像格式错误或图像损坏导致的。您可以检查一下代码中传递的frame变量的图像格式是否正确。
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:834) warning: F:\pycharm_python\projects tracking-python3-master ideooy-walking.mp4 (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:835) 这个错误表示无法打开视频文件。可能是文件不存在、文件格式不支持或者缺少视频解码器等原因。您可以检查一下视频文件路径是否正确、文件是否存在、文件是否受损、缺少视频解码器等问题。
第二个错误就如下修改
cap = VideoStream("F:/pycharm_python/projects/tracking-python3-master/videos/boy-walking.mp4").start()#修改前是\
对于第一个错误无奈本小白不会改:所以接着问
根据提示将原代码的对应部分修改为:
while True:
# grab each frame from the threaded stream, resize it, and convert it to grayscale (while still retaining 3 channels)
frame1 = cap.read()
frame = cv2.flip(frame1,1)
frame = imutils.resize(frame, width=450)
frame = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
frame = np.dstack([frame, frame, frame])
AttributeError: module 'cv2.cv2' has no attribute 'Tracker'
接着ChatGPT,答:
根据你提供的代码,出现 AttributeError: module 'cv2.cv2' has no attribute 'Tracker' 的原因是因为cv2模块中没有名为“Tracker”的属性。在OpenCV 3.2中,只有跟踪器类的实现,例如KCF,MIL等。因此,您需要实例化相应的类来使用所需的跟踪器。你可以参考OpenCV文档中的跟踪器部分来了解如何正确实例化相应的跟踪器。(疑惑:我慢慢用的是3.4.1.15版本的OpenCV)
if __name__ == '__main__':
#...
trackerType = trackerTypes[int(args["type"])]
if trackerType == 'BOOSTING':
trackerOpenCV = cv2.TrackerBoosting_create()
elif trackerType == 'MIL':
trackerOpenCV = cv2.TrackerMIL_create()
elif trackerType == 'KCF':
trackerOpenCV = cv2.TrackerKCF_create()
elif trackerType == 'TLD':
trackerOpenCV = cv2.TrackerTLD_create()
elif trackerType == 'MEDIANFLOW':
trackerOpenCV = cv2.TrackerMedianFlow_create()
elif trackerType == 'GOTURN':
trackerOpenCV = cv2.TrackerGOTURN_create()
再试一下改成
trackerOpenCV = cv2.TrackerKCF_create()
还是不行,文件警告中还是显示找不到引用的TrackerKCF_create()
然后看到这个老哥的一句话:
(2条消息) AttributeError:模块‘cv2.cv2‘没有属性‘TrackerKCF_create‘_Vstornzw的博客-CSDN博客https://blog.csdn.net/weixin_45481202/article/details/107700191
我真把opencv-python给卸载了,结果竟然出错了,他变成了-pencv-python(气死!)
智能手动找到文件目录,然后手动把文件夹“~pencv-python”给删了
重新把opencv-contrib-python安装,果然不报错 找不到引用‘TrackerKCF_create’了,
但是还是找不到get_frontal_face_detector,这个时候运行代码出现下述报错3:
Traceback (most recent call last): File "F:\pycharm_python\projects\tracking-python3-master\trackeOneObject.py", line 66, in
下面这两个兄弟提到版本问题,我检查了一下我的四19.7.1,可能真不行,我就卸载掉直接去pycharm里面重装一下。虽然提示卸载失败单其实卸载成功了。今天运气好直接装也能装上。
Dlib安装遇到的坑 - FreedomTrail - 博客园 (cnblogs.com)
(2条消息) No module named ‘dlib‘报错的解决方案!以及各种python版本对应的dlib资源!_dlib对应python版本_cool boy(ง •̀_•́)ง的博客-CSDN博客
虽然提示卸载失败单其实卸载成功了。今天运气好直接装也能装上。装的是19.8.1版本的,但是报错依然存在,再重装19.6.0还是不行。19.6.1也不行!19.5.1也不行!!!其他的好几个版本想试一下但不知道为啥我会安装失败。可能是版本和python以及opencv版本不适配?
再参考下面这个,还是不行:
(3条消息) 解决Cannot find reference 'xxx' in __init__.py - Python / Pycharm_yao1249736473的博客-CSDN博客
再问ChatGPT:
“这个错误通常是由于Dlib库的安装问题引起的。get_frontal_face_detector
是Dlib库中用于人脸检测的函数之一,如果无法找到这个函数,可能是因为库没有正确地安装或者安装不完整。
要解决这个问题,可以尝试以下几个步骤:
确认你已经成功安装了Dlib库。可以在命令行中使用pip show dlib
命令检查库是否已经安装,并确认版本号是否正确。
如果你已经安装了Dlib库,但仍然无法找到get_frontal_face_detector
函数,可能是由于Dlib库的路径未被正确添加到系统环境变量中。可以尝试添加Dlib库路径到系统环境变量中,或者使用绝对路径来导入get_frontal_face_detector
函数。
最后,你可以尝试卸载并重新安装Dlib库,确保安装过程没有出现任何错误或警告。可以尝试使用pip uninstall dlib
命令卸载Dlib库,然后使用pip install dlib
命令重新安装。
如果以上步骤无法解决问题,可能需要进一步检查系统环境变量或者尝试使用其他方法进行人脸检测。”
分析感觉感觉还是得重装dlib库,参考下面这个链接,对比发现我没装boost,和face_recognition(3条消息) Python dlib库的安装(不需要安装Visual Studio C++运行库)_Anubis_Anpu_的博客-CSDN博客
卸载dlib,然后在win+r进入cmd终端输入下面命令安装boost,dlib
python -m pip install boost -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
这里有发现一个坑,在cmd终端使用python -m pip install xxx安装软件包是在为默认安装路径下的解释器python.exe配置,而我之前一直是为自建项目opencv文件夹下的python.exe解释器配置软件包,所以得重新弄一下。
回到自建的opencv项目下,打开pycharm终端安装boost--失败(和上面的语句一致),再试一下安装什么都失败。
然后发现是可能是网络问题,我挂了梯子,把梯子断了就可以装了
python -m pip install boost -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
然后接着下载dlib
python -m pip install dlib==19.8.1 -i https://pypi.douban.com/simple --trusted-host pypi.douban.com#指定版本
python -m pip install dlib==19.6.1 -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
python -m pip install dlib==19.5.1 -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
#这几个版本都试过,后来发现和版本关系不大,
python -m pip install dlib -i https://pypi.douban.com/simple --trusted-host pypi.douban.com#不指定版本,默认下载最新版,可能与python版本不适配
再安装face_recognition
python -m pip install face_recognition i https://pypi.douban.com/simple --trusted-host pypi.douban.com
python -m pip install face_recognition==1.3.0 i https://pypi.douban.com/simple --trusted-host pypi.douban.com
上面两种都安装失败且报错
ERROR: Cannot determine archive format of C:\Users\86188\AppData\Local\Temp\pip-req-build-76a7f_e2
参考链接https://blog.csdn.net/m0_50140251/article/details/115211970,使用下述语句
python -m pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com face_recognition
安装成功!!!(如下图)
但是几遍重装了dlib还是“在 '__init__.py' 中找不到引用 'get_frontal_face_detector'”(有看到说虽然pycharm中有黄色警告,但是不会影响运行),所以先留着之后有影响再解决
可能会用到的:
python -m pip install --upgrade pip
python -m pip install --upgrade setuptools
python -m pip install --upgrade wheel
python -m pip install cmake -i https://pypi.douban.com/simple
(3条消息) cv2.error: OpenCV(3.4.2) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:25_ke0909的博客-CSDN博客
这篇分析感觉是对的,我加了下面代码后就不报错能正常跑了
if frame is None: break
然后单独加了一行代码cv2.imshow('pic', frame)
试试什么效果,结果只显示灰色窗口
又查了一下,发现,imshow
后必须使用waitKey
,参见(3条消息) cv2.imshow无法显示图像_cv2.imshow不显示图片_子翊寒的博客-CSDN博客
OK回到整个trackoneobject.py文件分析,cv.imshow后面确实没直接跟waitkey 然后添加上,还是不显示视频
分析了一下应该是这里continue跳出了,而frontFaceDetector = dlib.get_frontal_face_detector()
所以还是和 'get_frontal_face_detector'一直没有检测到人脸有关,
由于前面已经重装了很多次dlib,所以不觉得是dlib没配置导致的,那么应该就是视频里的没有人脸的原因/人脸太不明显导致的。
所以自己录了一段视频,运行,选roi,enter,成功啦!!效果如下图
然后重新卸载了dlib19.5.1版本因为我安装时有报错face-recognition 1.3.0 requires dlib>=19.7, but you have dlib 19.5.1 which is incompatible.也就是和facerecognition1.3.0版本冲突,虽然这个包我没用到,但我还是下载dlib19.8.1版本。跑一边也没有问题。
最后附上跑通的代码:
'''
Created on Sep 9, 2017
@author: inayat
'''
# import the required packages
from imutils.video import VideoStream
#from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2
import dlib
from utils.fps2 import FPS2
if __name__ == '__main__':
# Initialize the argument parse which is used to parse the arguments
ap = argparse.ArgumentParser()
#用数字012345代表类型
#在运行编辑配置中设置形参--type "2"
ap.add_argument("-t", "--type", required=True,
help="input from [0..5] for selection of type of tracker from ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN'] ")
args = vars(ap.parse_args())
print("[info] tracker selected is ", args["type"])
# a list of trackers type available in OpenCV3.2
#
trackerTypes = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
trackerType = trackerTypes[int(args["type"])]
trackerOpenCV = cv2.TrackerKCF_create()
# for initialization of the tracker we use dlib face detector
# initialize dlib face detector
frontFaceDetector = dlib.get_frontal_face_detector()
initOnce = False
print("[info] starting to read a video ...")
cap = cv2.VideoCapture("F:/pycharm_python/projects/tracking-python3-master/videos/face.mp4")
time.sleep(1.0)
# start the frame per second (FPS) counter
fps = FPS2().start()
# loop over the frames obtained from the webcam
while True:
# grab each frame from the threaded stream, resize it, and convert it to grayscale (while still retaining 3 channels)
ret, frame = cap.read()
if frame is None:
break
#frame = cv2.flip(frame, 1)
frame = imutils.resize(frame, width=450)
#frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#frame = np.dstack([frame, frame, frame])
# display the size of the queue on the frame
#cv2.putText(frame, "Queue Size: {}".format(fvs.Q.qsize()),
# (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
if not initOnce:
#frame后面的数字代表卷积核数,当不设定,时默认值为1,至于这里为什么设定为0,暂时不是很理解
faceRect = frontFaceDetector(frame, 0)
if(len(faceRect) == 0):
continue
# start the frame per second (FPS) counter
fps = FPS2().start()
bbox = faceRect[0]
print(bbox)
# convert dlib rect to opencv rect
curFaceBbox = (int(bbox.left()), int(bbox.top()), int(bbox.right() - bbox.left()),
int(bbox.bottom() - bbox.top()) )
# intialize the Tracker
curFaceBbox = cv2.selectROI("tracking", frame)
success = trackerOpenCV.init(frame, curFaceBbox)
initOnce = True
#continue
# Update tracker
success, curFaceBbox = trackerOpenCV.update(frame)
print(success, curFaceBbox)
if success:
# Tracking success
topLeft = (int(curFaceBbox[0]), int(curFaceBbox[1]))
bottomRight = (int(curFaceBbox[0] + curFaceBbox[2]), int(curFaceBbox[1] + curFaceBbox[3]))
cv2.rectangle(frame, topLeft,bottomRight, (255,0,0), 2,1 )
else:
# Tracking failure
cv2.putText(frame, trackerType + " Tracking failure detected", (20,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)
fps.update()
cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()),
(10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.putText(frame, trackerType + " Tracker", (20,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)
# show the frame and update the FPS counter
cv2.imshow("OpenCV Tracking by " + trackerType, frame)
cv2.waitKey(1)
k = cv2.waitKey(10) & 0xff
if k == 27:
break
# stop the timer and display FPS information
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
# do a bit of cleanup
cv2.destroyAllWindows()
cap.release()
解释器版本: