• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 4年前 (2022-01-08) 25次浏览 已收录 0个评论

这篇文章主要介绍了python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

单目标跟踪:

直接调用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)  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': cv2.trackerboosting_create() 'mil': cv2.trackermil_create() 'kcf': cv2.trackerkcf_create() 'tld': cv2.trackertld_create() 'medianflow': cv2.track<p style="color:transparent">来源gao!%daima.com搞$代*!码网</p>ermedianflow_create() 'goturn': cv2.trackergoturn_create() def initworking(self,frame,box): ''' 追踪器工作初始化 frame:初始化追踪画面 box:追踪的区域 not self.tracker: raise exception("追踪器未初始化") status=self.tracker.init(frame,box) status: exception("追踪器工作初始化失败") self.coord=box self.isworking=True track(self,frame): 开启追踪 message=None self.isworking: status,self.coord=self.tracker.update(frame) {"coord":[((int(self.coord[0]), int(self.coord[1])),(int(self.coord[0] + self.coord[2]), int(self.coord[1] self.coord[3])))]} self.draw_coord: p1=(int(self.coord[0]), int(self.coord[1])) p2=(int(self.coord[0] self.coord[3])) cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1) message['msg']="is tracking" return messageitem(frame,message) class objecttracker(object): __init__(self,dataset): self.cascade=cv2.CascadeClassifier(dataSet) 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) frame __name__== '__main__' : # tracker_types=['BOOSTING', 'mil','kcf', 'tld', 'medianflow', 'goturn'] tracker=Tracker(tracker_type="KCF") video=cv2.VideoCapture(0) cv2.videocapture("complex1.mov") cv2.videocapture(r" users youxinlin desktop video_data complex1.mov") ok, 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 27: break<pre></div><p>附带items.py,放在同个文件夹下:</p><div class="gaodaimacode"><pre class="prettyprint linenums"> #!/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 IOUti

以上就是python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址