opencv多目标追踪容器

之前做过一个多目标追踪的项目,尝试了一下opencv提供的追踪容器,个人感觉效果一般。

# coding:utf-8
# @Time : 14/12/2018 17:07
# @Author : SuRuiimport cv2
from functools import wrapsdef GetFps(func):@wraps(func)def wrapper(*args):timer = cv2.getTickCount()boxes = func(*args)fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)return boxes, fpsreturn wrapperclass MultipleTargetTracker:def __init__(self):self.multi_tracker = cv2.MultiTracker_create()self._method_name = None@propertydef method_name(self):return self._method_name@method_name.setterdef method_name(self, method):self._method_name = method@propertydef tracker_method(self):"""Choose one method from the follow list.'BOOSTING', 'CSRT', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'MOSSE', 'GOTURN':param method_name::return:"""# (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')tracker_types = ['BOOSTING', 'CSRT', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'MOSSE', 'GOTURN']tracker_generator = [cv2.TrackerBoosting_create, cv2.TrackerCSRT_create, cv2.TrackerMIL_create,cv2.TrackerKCF_create, cv2.TrackerTLD_create, cv2.TrackerMedianFlow_create,cv2.TrackerMOSSE_create, cv2.TrackerGOTURN_create]tracker_map = dict(zip(tracker_types, tracker_generator))tracker_method = tracker_map[self.method_name]return tracker_methoddef update_multi_tracker(self, image, boxes):self.multi_tracker = cv2.MultiTracker_create()# 必须对每个对象实例化一个追踪器才可以tracker_list = []for i in range(len(boxes)):tracker_list.append(self.tracker_method())x = boxes[i][0]y = boxes[i][1]w = boxes[i][2]h = boxes[i][3]#                             追踪器方法,     图片,  tuple(x, y, w, h)ok = self.multi_tracker.add(tracker_list[i], image, tuple([x, y, w, h]))# Update trackerok, bboxes = self.multi_tracker.update(image)print("-------- update ---------")print(bboxes)print("-------------------------")if not ok:raise NotImplementedError("Initial multiple-target tracker failed !")@GetFpsdef trace(self, frame):ok, boxes = self.multi_tracker.update(frame)if ok:return boxeselse:raise Exception("Tracking failure detected !")def view_result(tracker_method, frame, boxes, fps):for newbox in boxes:p1 = (int(newbox[0]), int(newbox[1]))p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))cv2.rectangle(frame, p1, p2, (200, 0, 0))# Display tracker type on frame              距离左上角的w和hcv2.putText(frame, tracker_method + " Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2)# Display FPS on framecv2.putText(frame, "  FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2)return frameif __name__ == "__main__":mtt = MultipleTargetTracker()mtt.method_name = "KCF"

调用的demo.py,指定一个需要多个追踪对象的视频,认为标定4个roi信息即可开始执行追踪。

# coding:utf-8
import sys
import cv2 as cv
import numpy as np# if len(sys.argv) != 2:
#     print('Input video name is missing')
#     exit()print('Select 3 tracking targets')cv.namedWindow("tracking")
camera = cv.VideoCapture('../test_data/hiv30.mp4')
tracker = cv.MultiTracker_create()
init_once = False
second_once = False
ok, image = camera.read()
if not ok:print('Failed to read video')exit()bbox1 = cv.selectROI(image, False)
bbox2 = cv.selectROI(image, False)
bbox3 = cv.selectROI(image, False)
bbox4 = cv.selectROI(image, False)print(type(bbox1))
print(bbox1)
newboxs = []
while camera.isOpened():ok, image = camera.read()if not ok:print('no image to read')breakif not init_once:ok = tracker.add(cv.TrackerKCF_create(), image, bbox1)ok = tracker.add(cv.TrackerKCF_create(), image, bbox2)ok = tracker.add(cv.TrackerKCF_create(), image, bbox3)init_once = Trueok, boxes = tracker.update(image)print(ok, boxes)if not second_once:ok = tracker.add(cv.TrackerKCF_create(), image, bbox4)second_once = Trueok, boxes = tracker.update(image)if ok:newboxs = boxesif not ok:del trackerprint('tracker 消失')tracker = cv.MultiTracker_create()for box in newboxs:box = tuple(box)ok = tracker.add(cv.TrackerKCF_create(), image, box)for newbox in boxes:p1 = (int(newbox[0]), int(newbox[1]))p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))cv.rectangle(image, p1, p2, (200, 0, 0))cv.imshow('tracking', image)k = cv.waitKey(1)if k == 27: break  # esc pressed

opencv多目标追踪容器相关推荐

  1. 如何使用opencv进行目标追踪

    日常@尊师: © Fu Xianjun. All Rights Reserved. 使用opencv目标追踪之前先要在CDM中 安装pytesseract 代码是:pip install pytess ...

  2. OpenCV图像处理——目标追踪

    总目录 图像处理总目录←点击这里 二十四.目标追踪 24.1.多目标(手动检测)追踪 24.1.1.原理 目标检测:运行之后按下s,通过鼠标对某个目标进行检测,然后点击空格或者回车 目标追踪:open ...

  3. OpenCV camshift目标追踪

    camshift算法是对meanshift算法的改进,首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口. c ...

  4. OpenCV meanshift目标追踪

    meanshift原理:一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束. Meanshift算法:简单,迭代次数少,但无法解决目 ...

  5. 【Opencv】目标追踪——高斯混合模型分离算法(MOG)

    文章目录 1 环境 2 效果 3 原理 4 代码 1 环境 Python 3.8.8 PyCharm 2021 opencv-python 2 效果 3 原理   视频图像中的目标检测与跟踪,是计算机 ...

  6. python—opencv 实时视频目标追踪

    功能: 1.获取摄像头,实时显示 2.鼠标获取第一帧中的目标roi区域 3.在视频中实时对目标进行追踪. 4.两种目标追踪的方式:'meanshift','camshift' 5.保存视频 impor ...

  7. 用opencv实现目标追踪的学习笔记——camshift

    小白的学习笔记--opencv camshift -基础:零c++基础,零opencv基础,简单C语言基础,略知数字图像处理知识 -工具:VS2015+opencv 2.4.13 -sample: E ...

  8. python机器识别追踪_多目标追踪器:用OpenCV实现多目标追踪(C++/Python)

    原标题:多目标追踪器:用OpenCV实现多目标追踪(C++/Python) MultiTracker : Multiple Object Tracking using OpenCV (C++/Pyth ...

  9. 基于opencv的BackgroundSubtractorMOG2目标追踪

    基于opencv的BackgroundSubtractorMOG2目标追踪 BackgroundSubtractorMOG2是以高斯混合模型为基础的背景/前景分割算法.它是以2004年和2006年Z. ...

最新文章

  1. 快速排序及优化(Java实现)
  2. 设计立方体类(求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等)
  3. HTML5实战 学习笔记
  4. 连接mysql报zone时区错误
  5. Controller 如果能保持单例,尽量使用单例
  6. 软件测试实验报告下载 实验一到实验五
  7. 关于Cocos2d-x中init方法和onEnter方法的区别
  8. python读取日期_从文件中读取日期和数据(Python)
  9. go 调用c语言,golang之调用C语言代码
  10. 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
  11. python反转链表_206. 反转链表(Python)
  12. 外部库依赖以及 编译
  13. 第11周学习进度情况
  14. DB2 SqlCode对照表
  15. c#样条曲线命令_C#基数样条曲线的模拟实现(对应Graphics的DrawCurve)
  16. [事务] 事务的传播机制
  17. linux异常死机日志,Linux常见死机原因
  18. vue引入外部js文件(第三方js工具或者jq库)
  19. Kubernetes集群安装 gatekeeper
  20. 中国水球装备行业市场供需与战略研究报告

热门文章

  1. 数据结构笔记(五)-- 循环链表的实现
  2. you are not allowed to push code to protected branches on this project
  3. 鼠标悬停显示图片html5,JavaScript 鼠标悬停图片,显示隐藏文本
  4. python高性能_Python高性能分布式执行框架-Ray
  5. python调用pipe_Python中使用PIPE操作Linux管道
  6. 如何在github上找到自己想要的代码_如何在 GitHub 上找到免费且实用的软件?
  7. confluence启动不起来_“一键启动”只能点火?还有这5个“隐藏”功能,你都知道吗?...
  8. kafka session.timeout.ms 是指消费一条数据的时间?_干货 | Kafka 内核知识梳理,附思维导图...
  9. html表格 行 自动向上,javascript – 在bootstraptable中向上或向下移动行
  10. mapbox 修改初始位置_《绝地求生》实用的键位改键推荐 | 哪些不合理的初始键位需要更改?...