目标跟踪——KCF源码用python实现
from numpy.fft import fft2, ifft2, fftshift
import cv2
import numpy as npclass HOG:def __init__(self, winSize):""":param winSize: 检测窗口的大小"""self.winSize = winSizeself.blockSize = (8, 8)self.blockStride = (4, 4)self.cellSize = (4, 4)self.nBins = 9self.hog = cv2.HOGDescriptor(winSize, self.blockSize, self.blockStride,self.cellSize, self.nBins)def get_feature(self, image):winStride = self.winSizew, h = self.winSizew_block, h_block = self.blockStridew = w//w_block - 1h = h//h_block - 1# 计算给定图像的HOG特征描述子,一个n*1的特征向量hist = self.hog.compute(img=image, winStride=winStride, padding=(0, 0))return hist.reshape(w, h, 36).transpose(2, 1, 0) # 交换轴的顺序def show_hog(self, hog_feature):c, h, w = hog_feature.shapefeature = hog_feature.reshape(2, 2, 9, h, w).sum(axis=(0, 1))grid = 16hgrid = grid // 2img = np.zeros((h*grid, w*grid))for i in range(h):for j in range(w):for k in range(9):x = int(10 * feature[k, i, j] * np.cos(x=np.pi / 9 * k))y = int(10 * feature[k, i, j] * np.sin(x=np.pi / 9 * k))cv2.rectangle(img=img, pt1=(j*grid, i*grid), pt2=((j + 1) * grid, (i + 1) * grid),color=(255, 255, 255))x1 = j * grid + hgrid - xy1 = i * grid + hgrid - yx2 = j * grid + hgrid + xy2 = i * grid + hgrid + ycv2.line(img=img, pt1=(x1, y1), pt2=(x2, y2), color=(255, 255, 255), thickness=1)cv2.imshow("img", img)cv2.waitKey(0)class Tracker:def __init__(self):# 超参数设置self.max_patch_size = 256self.padding = 2.5self.sigma = 0.6self.lambdar = 0.0001self.update_rate = 0.012self.gray_feature = Falseself.debug = False# 算法变量定义self.scale_h = 0.self.scale_w = 0.self.ph = 0self.pw = 0self.hog = HOG((self.pw, self.pw))self.alphaf = Noneself.x = Noneself.roi = Nonedef first_frame(self, image, roi):"""对视频的第一帧进行标记,更新tracer的参数:param image: 第一帧图像:param roi: 第一帧图像的初始ROI元组:return: None"""x1, y1, w, h = roicx = x1 + w // 2cy = y1 + h // 2roi = (cx, cy, w, h)# 确定Patch的大小,并在此Patch中提取HOG特征描述子scale = self.max_patch_size / float(max(w, h))self.ph = int(h * scale) // 4 * 4 + 4self.pw = int(w * scale) // 4 * 4 + 4self.hog = HOG((self.pw, self.ph))# 在矩形框的中心采样、提取特征x = self.get_feature(image, roi)y = self.gaussian_peak(x.shape[2], x.shape[1])self.alphaf = self.train(x, y, self.sigma, self.lambdar)self.x = xself.roi = roidef update(self, image):"""对给定的图像,重新计算其目标的位置:param image::return:"""# 包含矩形框信息的四元组(min_x, min_y, w, h)cx, cy, w, h = self.roimax_response = -1 # 最大响应值for scale in [0.95, 1.0, 1.05]:# 将ROI值处理为整数roi = map(int, (cx, cy, w * scale, h * scale))z = self.get_feature(image, roi) # tuple(36, h, w)# 计算响应responses = self.detect(self.x, z, self.sigma)height, width = responses.shapeif self.debug:cv2.imshow("res", responses)cv2.waitKey(0)idx = np.argmax(responses)res = np.max(responses)if res > max_response:max_response = resdx = int((idx % width - width / 2) / self.scale_w)dy = int((idx / width - height / 2) / self.scale_h)best_w = int(w * scale)best_h = int(h * scale)best_z = z# 更新矩形框的相关参数self.roi = (cx + dx, cy + dy, best_w, best_h)# 更新模板self.x = self.x * (1 - self.update_rate) + best_z * self.update_ratey = self.gaussian_peak(best_z.shape[2], best_z.shape[1])new_alphaf = self.train(best_z, y, self.sigma, self.lambdar)self.alphaf = self.alphaf * (1 - self.update_rate) + new_alphaf * self.update_ratecx, cy, w, h = self.roireturn cx - w // 2, cy - h // 2, w, hdef get_feature(self, image, roi):"""对特征进行采样:param image::param roi: 包含矩形框信息的四元组(min_x, min_y, w, h):return:"""# 对矩形框做2.5倍的Padding处理cx, cy, w, h = roiw = int(w*self.padding)//2*2h = int(h*self.padding)//2*2x = int(cx - w//2)y = int(cy - h//2)# 矩形框所覆盖的距离sub_img = image[y:y+h, x:x+w, :]resized_img = cv2.resize(src=sub_img, dsize=(self.pw, self.ph))if self.gray_feature:feature = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY)feature = feature.reshape(1, self.ph, self.pw)/255.0 - 0.5else:feature = self.hog.get_feature(resized_img)if self.debug:self.hog.show_hog(feature)# Hog特征的通道数、高估、宽度fc, fh, fw = feature.shapeself.scale_h = float(fh)/hself.scale_w = float(fw)/w# 两个二维数组,前者(fh,1),后者(1,fw)hann2t, hann1t = np.ogrid[0:fh, 0:fw]hann1t = 0.5 * (1 - np.cos(2 * np.pi * hann1t / (fw - 1)))hann2t = 0.5 * (1 - np.cos(2 * np.pi * hann2t / (fh - 1)))# 一个fh x fw的矩阵hann2d = hann2t * hann1tfeature = feature * hann2dreturn featuredef gaussian_peak(self, w, h):""":param w::param h::return: 一个w*h的高斯矩阵"""output_sigma = 0.125sigma = np.sqrt(w * h) / self.padding * output_sigmasyh, sxh = h//2, w//2y, x = np.mgrid[-syh:-syh + h, -sxh:-sxh + w]x = x + (1 - w % 2) / 2.y = y + (1 - h % 2) / 2.g = 1. / (2. * np.pi * sigma ** 2) * np.exp(-((x ** 2 + y ** 2) / (2. * sigma ** 2)))return gdef kernel_correlation(self, x1, x2, sigma):"""核化的相关滤波操作:param x1::param x2::param sigma: 高斯参数sigma:return:"""# 转换到傅里叶空间fx1 = fft2(x1)fx2 = fft2(x2)# \hat{x^*} \otimes \hat{x}',x*的共轭转置与x'的乘积tmp = np.conj(fx1) * fx2# 离散傅里叶逆变换转换回真实空间idft_rbf = ifft2(np.sum(tmp, axis=0))# 将零频率分量移到频谱中心。idft_rbf = fftshift(idft_rbf)# 高斯核的径向基函数d = np.sum(x1 ** 2) + np.sum(x2 ** 2) - 2.0 * idft_rbfk = np.exp(-1 / sigma ** 2 * np.abs(d) / d.size)return kdef train(self, x, y, sigma, lambdar):"""原文所给参考train函数:param x::param y::param sigma::param lambdar::return:"""k = self.kernel_correlation(x, x, sigma)return fft2(y) / (fft2(k) + lambdar)def detect(self, x, z, sigma):"""原文所给参考detect函数:param x::param z::param sigma::return:"""k = self.kernel_correlation(x, z, sigma)# 傅里叶逆变换的实部return np.real(ifft2(self.alphaf * fft2(k)))def track(video_path):cap = cv2.VideoCapture(video_path)tracker = Tracker()ok, frame = cap.read()if not ok:print("error reading video")exit(-1)roi = cv2.selectROI("tracking", frame, False, False)# roi = (218, 302, 148, 108)tracker.first_frame(frame, roi)while cap.isOpened():ok, frame = cap.read()if not ok:breakx, y, w, h = tracker.update(frame)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 1)cv2.imshow('tracking', frame)c = cv2.waitKey(1) & 0xFFif c == 27 or c == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':video_path = r'D:\desk\Work\API\fpga\siamfc-pytorch\video\444.mp4'track(video_path=video_path)
参考链接
https://blog.csdn.net/qq_59109986/article/details/127892628
相关文章:
目标跟踪——KCF源码用python实现
from numpy.fft import fft2, ifft2, fftshift import cv2 import numpy as npclass HOG:def __init__(self, winSize):""":param winSize: 检测窗口的大小"""self.winSize winSizeself.blockSize (8, 8)self.blockStride (4, 4)self.cellSiz…...
前端 转换笔记
<!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>转换</title> <style> .box{ /* 盒子摆在body的正中间 */ position: absolut…...
个人开发笔记
开发笔记 开发常见问题Vue开发中页面flex滚动布局,内容置顶问题功能快捷键 开发常见问题 Vue开发中页面flex滚动布局,内容置顶问题 直接操作路由: const router createRouter({routes: routes,history: createWebHashHistory(),scrollBeha…...
pdf压缩,pdf压缩在线,pdf文件太大怎么变小
在数字化时代,PDF文档因其跨平台、保持原样、易于阅读和打印等特点,成为了我们日常工作和生活中不可或缺的一部分。然而,随着PDF文件的不断累积,存储空间逐渐变得紧张,特别是在处理大量大型PDF文件时,如何有…...
Go 如何使用指针灵活操作内存
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
【面试干货】Java中的++操作符与线程安全性
【面试干货】Java中的操作符与线程安全性 1、什么是线程安全性?2、 操作符的工作原理3、 操作符与线程安全性4、如何确保线程安全?5、 结论 💖The Begin💖点点关注,收藏不迷路💖 在Java编程中,操…...
NLP学习与踩坑记录(持续更新版)
NLP学习与踩坑记录(持续更新版) OSError: Cant load tokenizer for bert-base-uncased.google.protobuf.message.DecodeError: Error parsing messageDeepspeed 本博客记录了博主在学习NLP时遇到了各种各样的问题与解决方法,供大家参考&#…...
Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别
文章目录 1. 环境准备1.1 安装 Tesseract OCR 引擎1.2 引入 Tess4J 依赖 2. 创建 Spring Boot 项目2.1 初始化项目2.2 目录结构 3. 编写 OCR 功能代码3.1 创建服务层3.2 创建控制器层 4. 配置 Tesseract 语言包5. 运行和测试5.1 启动 Spring Boot 应用5.2 使用 Postman 或 cURL…...
微信小程序常用标签及其用法
大家好,我是linzi,今天我来给大家分享一下微信小程序一些个常用的标签及其用法 1. <view> 标签 <view> 标签是小程序中最常用的标签之一,用于组织和布局页面上的内容,类似于HTML中的 <div> 标签。 <view …...
开发查询订单信息fastGPT智能体工作流 将工作流接入到人工客服系统
我在抖音上发布了视频 https://www.douyin.com/video/7382446337482099977 下面是主要内容介绍 【视频标题:】开发查询订单信息fastGPT智能体工作流 将工作流接入到人工客服系统 #智能体 #FastGPT #客服系统-----------【视频行业分类:】<3C数码>-…...
Flink集群运行模式
我们了解了flink的一个集群的一个基础架构,包括里面核心的一些组件,比如说job manager,task manager等一些组件的一些主要的一些组成。本节课程开始我们学习flink的一个集群部署模式。首先我们来看一下flink集群部署模式究竟应该有哪一些种类…...
XSS 安全漏洞介绍及修复方案
简介 XSS(Cross Site Scripting)是一种常见的 Web 安全漏洞,攻击者通过在网页中注入恶意脚本代码,使得网页在用户端执行这些脚本,从而窃取用户信息或者进行其他恶意操作。为了防止 XSS 攻击,可以使用正则表…...
基于STM32的智能仓库管理系统
目录 引言环境准备智能仓库管理系统基础代码实现:实现智能仓库管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景:仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通过使用STM32嵌…...
LeetCode —— 只出现一次的数字
只出现一次的数字 I 本题依靠异或运算符的特性,两个相同数据异或等于0,数字与0异或为本身即可解答。代码如下: class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for (auto e : nums){ret ^ e;}return ret;} };只出…...
python遍历文件夹中所有图片
python遍历文件夹中的图片-CSDN博客 这个是之前的版本,现在这个版本会更好,直接进来就在列表中 path glob.glob("1/*.jpg")print(path)print(len(path))path_img glob.glob("1/*.jpg")path_img.extend(path)print(len(path_img))…...
速盾:DDOS能打死高防ip吗?
DDoS攻击是一种利用大量计算机或设备发起的分布式拒绝服务攻击。它的目标是通过发送大量流量或请求,使目标服务器或网络资源无法正常工作。高防IP是一种具有强大防御能力的网络服务,能够抵御各种形式的网络攻击,包括DDoS攻击。然而࿰…...
3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置
渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果,仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时,兼顾渲染速度和时间还需要进行一些调节设置,如何让渲染效果更加逼真? 一、全局照明与…...
Android的OverlayFS原理与作用
标签: OverlayFS; Android;Overlay Filesystem; Android的OverlayFS原理与作用 概述 OverlayFS(Overlay Filesystem)是一种联合文件系统,允许将一个或多个文件系统叠加在一起,使它们表现为一个单一的文件系统。Android系统利用OverlayFS来实现动态文件系统的叠加和管…...
奇点临近:人类与智能时代的未来
在信息爆炸的时代,我们每天都被海量的信息所淹没,如何才能在这个嘈杂的世界中找到真正有价值的信息?如何才能利用信息的力量,提升我们的认知水平,重塑我们的未来? 这些问题的答案,或许都能在雷…...
NAS教程丨铁威马如何登录 SSH终端?
适用型号: 所有TNAS 型号 如您有特殊操作需要通过 SSH 终端登录 TNAS,请参照以下指引: (注意: 关于以下操作步骤中的"cd /"的指令,其作用是使当前 SSH/Telnet 连接的位置切换到根目录,以免造成对卷的占用.请不要遗漏它.) Windows…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
