python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)


Posted in Python onJanuary 08, 2020

单目标跟踪:

直接调用opencv中封装的tracker即可。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 5 17:50:47 2020
第四章 kcf跟踪
@author: youxinlin
"""
import cv2
from items import MessageItem
import time
import numpy as np
'''
监视者模块,负责入侵检测,目标跟踪
'''
class WatchDog(object):
 #入侵检测者模块,用于入侵检测
 def __init__(self,frame=None):
  #运动检测器构造函数
  self._background = None
  if frame is not None:
   self._background = cv2.GaussianBlur(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY),(21,21),0)
  self.es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10))
 def isWorking(self):
  #运动检测器是否工作
  return self._background is not None
 def startWorking(self,frame):
  #运动检测器开始工作
  if frame is not None:
   self._background = cv2.GaussianBlur(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), (21, 21), 0)
 def stopWorking(self):
  #运动检测器结束工作
  self._background = None
 def analyze(self,frame):
  #运动检测
  if frame is None or self._background is None:
   return
  sample_frame = cv2.GaussianBlur(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY),(21,21),0)
  diff = cv2.absdiff(self._background,sample_frame)
  diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
  diff = cv2.dilate(diff, self.es, iterations=2)
  image, cnts, hierarchy = cv2.findContours(diff.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  coordinate = []
  bigC = None
  bigMulti = 0
  for c in cnts:
   if cv2.contourArea(c) < 1500:
    continue
   (x,y,w,h) = cv2.boundingRect(c)
   if w * h > bigMulti:
    bigMulti = w * h
    bigC = ((x,y),(x+w,y+h))
  if bigC:
   cv2.rectangle(frame, bigC[0],bigC[1], (255,0,0), 2, 1)
  coordinate.append(bigC)
  message = {"coord":coordinate}
  message['msg'] = None
  return MessageItem(frame,message)
class Tracker(object):
 '''
 追踪者模块,用于追踪指定目标
 '''
 def __init__(self,tracker_type = "BOOSTING",draw_coord = True):
  '''
  初始化追踪器种类
  '''
  #获得opencv版本
  (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
  self.tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
  self.tracker_type = tracker_type
  self.isWorking = False
  self.draw_coord = draw_coord
  #构造追踪器
  if int(minor_ver) < 3:
   self.tracker = cv2.Tracker_create(tracker_type)
  else:
   if tracker_type == 'BOOSTING':
    self.tracker = cv2.TrackerBoosting_create()
   if tracker_type == 'MIL':
    self.tracker = cv2.TrackerMIL_create()
   if tracker_type == 'KCF':
    self.tracker = cv2.TrackerKCF_create()
   if tracker_type == 'TLD':
    self.tracker = cv2.TrackerTLD_create()
   if tracker_type == 'MEDIANFLOW':
    self.tracker = cv2.TrackerMedianFlow_create()
   if tracker_type == 'GOTURN':
    self.tracker = cv2.TrackerGOTURN_create()
 def initWorking(self,frame,box):
  '''
  追踪器工作初始化
  frame:初始化追踪画面
  box:追踪的区域
  '''
  if not self.tracker:
   raise Exception("追踪器未初始化")
  status = self.tracker.init(frame,box)
  if not status:
   raise Exception("追踪器工作初始化失败")
  self.coord = box
  self.isWorking = True
 def track(self,frame):
  '''
  开启追踪
  '''
  message = None
  if self.isWorking:
   status,self.coord = self.tracker.update(frame)
   if status:
    message = {"coord":[((int(self.coord[0]), int(self.coord[1])),(int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3])))]}
    if self.draw_coord:
     p1 = (int(self.coord[0]), int(self.coord[1]))
     p2 = (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3]))
     cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)
     message['msg'] = "is tracking"
  return MessageItem(frame,message)
class ObjectTracker(object):
 def __init__(self,dataSet):
  self.cascade = cv2.CascadeClassifier(dataSet)
 def track(self,frame):
  gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  faces = self.cascade.detectMultiScale(gray,1.03,5)
  for (x,y,w,h) in faces:
   cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
  return frame
if __name__ == '__main__' :
# tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
 tracker = Tracker(tracker_type="KCF")
# video = cv2.VideoCapture(0)
# video = cv2.VideoCapture("complex1.mov")
 video = cv2.VideoCapture(r"/Users/youxinlin/Desktop/video_data/complex1.MOV") 
 ok, frame = video.read()
 bbox = cv2.selectROI(frame, False)
 tracker.initWorking(frame,bbox)
 while True:
  _,frame = video.read();
  if(_):
   item = tracker.track(frame);
   cv2.imshow("track",item.getFrame())
   k = cv2.waitKey(1) & 0xff
   if k == 27:
    break

附带items.py,放在同个文件夹下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 5 17:51:04 2020
@author: youxinlin
"""
import json
from utils import IOUtil
'''
信息封装类
'''
class MessageItem(object):
 #用于封装信息的类,包含图片和其他信息
 def __init__(self,frame,message):
  self._frame = frame
  self._message = message
 def getFrame(self):
  #图片信息
  return self._frame
 def getMessage(self):
  #文字信息,json格式
  return self._message
 def getBase64Frame(self):
  #返回base64格式的图片,将BGR图像转化为RGB图像
  jepg = IOUtil.array_to_bytes(self._frame[...,::-1])
  return IOUtil.bytes_to_base64(jepg)
 def getBase64FrameByte(self):
  #返回base64格式图片的bytes
  return bytes(self.getBase64Frame())
 def getJson(self):
  #获得json数据格式
  dicdata = {"frame":self.getBase64Frame().decode(),"message":self.getMessage()}
  return json.dumps(dicdata)
 def getBinaryFrame(self):
  return IOUtil.array_to_bytes(self._frame[...,::-1])

utils.py:也放在同一个文件夹下。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 5 17:51:40 2020
@author: youxinlin
"""
import time
import numpy
import base64
import os
import logging
import sys
from PIL import Image
from io import BytesIO
#工具类
class IOUtil(object):
 #流操作工具类
 @staticmethod
 def array_to_bytes(pic,formatter="jpeg",quality=70):
  '''
  静态方法,将numpy数组转化二进制流
  :param pic: numpy数组
  :param format: 图片格式
  :param quality:压缩比,压缩比越高,产生的二进制数据越短
  :return: 
  '''
  stream = BytesIO()
  picture = Image.fromarray(pic)
  picture.save(stream,format=formatter,quality=quality)
  jepg = stream.getvalue()
  stream.close()
  return jepg
 @staticmethod
 def bytes_to_base64(byte):
  '''
  静态方法,bytes转base64编码
  :param byte: 
  :return: 
  '''
  return base64.b64encode(byte)
 @staticmethod
 def transport_rgb(frame):
  '''
  将bgr图像转化为rgb图像,或者将rgb图像转化为bgr图像
  '''
  return frame[...,::-1]
 @staticmethod
 def byte_to_package(bytes,cmd,var=1):
  '''
  将每一帧的图片流的二进制数据进行分包
  :param byte: 二进制文件
  :param cmd:命令
  :return: 
  '''
  head = [ver,len(byte),cmd]
  headPack = struct.pack("!3I", *head)
  senddata = headPack+byte
  return senddata
 @staticmethod
 def mkdir(filePath):
  '''
  创建文件夹
  '''
  if not os.path.exists(filePath):
   os.mkdir(filePath)
 @staticmethod
 def countCenter(box):
  '''
  计算一个矩形的中心
  '''
  return (int(abs(box[0][0] - box[1][0])*0.5) + box[0][0],int(abs(box[0][1] - box[1][1])*0.5) +box[0][1])
 @staticmethod
 def countBox(center):
  '''
  根据两个点计算出,x,y,c,r
  '''
  return (center[0][0],center[0][1],center[1][0]-center[0][0],center[1][1]-center[0][1])
 @staticmethod
 def getImageFileName():
  return time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())+'.png'

多目标跟踪:

和单目标差不多,改用MultiTracker_create()

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 5 18:02:33 2020

目标跟踪

@author: youxinlin
"""import numpy as np
import cv2
import sys
'''
if len(sys.argv) != 2:
 print('Input video name is missing')
 exit()
'''
print('Select multiple tracking targets') 
cv2.namedWindow("tracking")
camera = cv2.VideoCapture(r"/Users/youxinlin/Desktop/video_data/complex6.MOV") 
#camera = cv2.VideoCapture(0)
tracker = cv2.MultiTracker_create() #多目标跟踪
a= cv2.Tracker_c
init_once = False
ok, image=camera.read()
if not ok:
 print('Failed to read video')
 exit()
bbox1 = cv2.selectROI('tracking', image)
bbox2 = cv2.selectROI('tracking', image)
bbox3 = cv2.selectROI('tracking', image)
while camera.isOpened():
 ok, image=camera.read()
 if not ok:
  print ('no image to read')
  break
 if not init_once:
  ok = tracker.add(cv2.TrackerKCF_create(),image,bbox1)
  ok = tracker.add(cv2.TrackerKCF_create( ),image, bbox2)
  ok = tracker.add(cv2.TrackerKCF_create(),image, bbox3)
  init_once = True
 ok, boxes = tracker.update(image)
 for newbox in boxes:
  p1 = (int(newbox[0]), int(newbox[1]))
  p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))
  cv2.rectangle(image, p1, p2, (0,0,255))
 cv2.imshow('tracking', image)
 k = cv2.waitKey(1)
 if k == 27 : break # esc pressed

多尺度检测的KCF、自定义所用特征的KCF

在一些场景下,不想使用默认的hog特征跟踪,或需要对比不同特征的跟踪效果,那么封装好的方法似乎不可用,需要可以自己撸一波kcf的代码,从而使用自己设定的特征。

总结

以上所述是小编给大家介绍的python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
浅析Python中else语句块的使用技巧
Jun 16 Python
Python实现的简单dns查询功能示例
May 24 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
浅析python中的迭代与迭代对象
Oct 08 Python
python实现手机销售管理系统
Mar 19 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
opencv+python实现均值滤波
Feb 19 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
一行代码python实现文件共享服务器
Apr 22 Python
Pytorch实现神经网络的分类方式
Jan 08 #Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 #Python
基于python3抓取pinpoint应用信息入库
Jan 08 #Python
Python PyInstaller安装和使用教程详解
Jan 08 #Python
关于Pytorch的MLP模块实现方式
Jan 07 #Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 #Python
Pytorch中膨胀卷积的用法详解
Jan 07 #Python
You might like
PHP 程序员应该使用的10个组件
2009/10/31 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
php笔记之:AOP的应用
2013/04/24 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
PHP 断点续传实例详解
2017/11/11 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
Python随机生成数模块random使用实例
2015/04/13 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python实现括号匹配方法详解
2020/02/10 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
出生医学证明样本
2014/01/17 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
培训班通知
2015/04/25 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL