多目标追踪器:用 OpenCV 实现多目标追踪

极市学习Day3 OpenCV目标跟踪实例练习

  • 关于 OpenCV 运行中的问题
    • 安装OpenCV
    • OpenCV目标跟踪运行出错
  • 代码小小的解析
    • Attention
    • 第一步:创建单目标追踪器
    • 第二步:读取视频的第一帧
    • 第三步:在第一帧中定位物体
    • 第三步:初始化多目标追踪器
    • 第四步:更新多目标追踪器并展示结果

多目标追踪器:用 OpenCV 实现多目标追踪(C++/Python)

关于 OpenCV 运行中的问题

安装OpenCV

  1. 在pyCharm或者anaconda 控制台里面直接安装
pip install opencv-python
  1. 在本地下载包后安装
    opencv_python-3.4.3.18-cp37-cp37m-win_amd64.whl
    下载之后,把下载包放在{编译器目录}\Scripts
    编译器目录可以在pycharm的 File - Settings - Project Interpreter
    在目录的空白处Shift+鼠标右键打开Power Shell输入
pip install --user opencv_contrib_python-3.4.3.18-cp37-cp37m-win_amd64.whl

提示安装成功!

再使用pip list命令来确认一下安装是否成功:

pip list
  1. 作者是使用下面这种方法解决
    首先更改PyCharm里面的pip源为国内的源
阿里云 http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

豆瓣(douban) http://pypi.douban.com/simple/

清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/

中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

OpenCV目标跟踪运行出错

问题
AttributeError: module 'cv2.cv2' has no attribute 'TrackerCSRT_create'
xxx
解析:opencv其实没有tracker这个功能,所以你需要安装opencv-contrib,具体安装方法就是简单的pip install,如下

  1. 直接装pip install opencv-contrib-python==你的opencv版本号

  2. 本地安装
    下载地址
    步骤如上

代码小小的解析

Attention

测试视频目录更改
在这里插入图片描述

第一步:创建单目标追踪器

OpenCV 有八个不同的追踪器类型:BOOSTING, MTL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT.
多目标追踪器:用 OpenCV 实现多目标追踪_第1张图片

第二步:读取视频的第一帧

一个多目标追踪器需要两个输入

1.视频的一帧

2.你想要追踪的所有目标的位置(边界框)

给定这些信息,追踪器会在多有子序列帧中追踪这些特定目标的位置。

在下面的代码中,我们先用 VidoeCapture 类加载视频,读取第一帧。这一帧将会用于之后的 MultiTracker 的初始化。

# Set video to load
 videoPath = "videos/run.mp4"

 # Create a video capture object to read videos
 cap = cv2.VideoCapture(videoPath)

 # Read first frame
 success, frame = cap.read()
 # quit if unable to read the video file
 if not success:
   print('Failed to read video')
   sys.exit(1)

第三步:在第一帧中定位物体

在第一帧中定位我们想要追踪的物体。位置是一个简单的边界框。OpenCV 提供了一个叫做 selectROI 的功能,它可以弹出一个 GUI 来选择边界框(也叫做感兴趣的区域(ROI))。在C++版本中,selectROI允许你得到多个边界框,但在 Python 版本中,它会只返回一个边界框。所以,在 Python 版本中,我们需要一个循环来得到多个边界框。

对于每个目标,我们还会选择随机的颜色来显示边界框。下面就是实现代码。

## Select boxes
bboxes = []
colors = [] 

# OpenCV's selectROI function doesn't work for selecting multiple objects in Python
# So we will call this function in a loop till we are done selecting all objects
while True:
 # draw bounding boxes over objects
 # selectROI's default behaviour is to draw box starting from the center
 # when fromCenter is set to false, you can draw box starting from top left corner
 bbox = cv2.selectROI('MultiTracker', frame)
 bboxes.append(bbox)
 colors.append((randint(0, 255), randint(0, 255), randint(0, 255)))
 print("Press q to quit selecting boxes and start tracking")
 print("Press any other key to select next object")
 k = cv2.waitKey(0) & 0xFF
 if (k == 113):  # q is pressed
   break

print('Selected bounding boxes {}'.format(bboxes))

第三步:初始化多目标追踪器

首先创建一个 MuliTracker 对象并且增加和单个目标追踪器一样多的边界框。在这个例子中,用的是 CSRT 单目标追踪器,但是你尝试可以通过将 trackerTyper 变量改变为这篇文章一开始提到的8种追踪器中的一种,来尝试其使用他类型的追踪器。CSRT 追踪器不是最快的,但它在我们尝试的许多情况下都能生成最好的结果。

你可以用封装在同一个 MultiTracker 中的不同的追踪器,但是当然,这意义不大。

MultiTracker 类是一个简单的单目标追踪器的封装器。我们从前边的文章中知道,初始化单目标追踪器,我们需要视频第一帧和用来标定我们想要追踪的目标位置的边界框。多目标追踪器将这些信息传递给它内部封装的单目标追踪器。

# Specify the tracker type
trackerType = "CSRT"   

# Create MultiTracker object
multiTracker = cv2.MultiTracker_create()

# Initialize MultiTracker 
for bbox in bboxes:
 multiTracker.add(createTrackerByName(trackerType), frame, bbox)

第四步:更新多目标追踪器并展示结果

多目标追踪器:用 OpenCV 实现多目标追踪_第2张图片

你可能感兴趣的:(计算机视觉,极市学习记录,opencv,深度学习,python)