当前位置: 首页 > news >正文

目标跟踪——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滚动布局&#xff0c;内容置顶问题功能快捷键 开发常见问题 Vue开发中页面flex滚动布局&#xff0c;内容置顶问题 直接操作路由&#xff1a; const router createRouter({routes: routes,history: createWebHashHistory(),scrollBeha…...

pdf压缩,pdf压缩在线,pdf文件太大怎么变小

在数字化时代&#xff0c;PDF文档因其跨平台、保持原样、易于阅读和打印等特点&#xff0c;成为了我们日常工作和生活中不可或缺的一部分。然而&#xff0c;随着PDF文件的不断累积&#xff0c;存储空间逐渐变得紧张&#xff0c;特别是在处理大量大型PDF文件时&#xff0c;如何有…...

Go 如何使用指针灵活操作内存

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

【面试干货】Java中的++操作符与线程安全性

【面试干货】Java中的操作符与线程安全性 1、什么是线程安全性&#xff1f;2、 操作符的工作原理3、 操作符与线程安全性4、如何确保线程安全&#xff1f;5、 结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程中&#xff0c;操…...

NLP学习与踩坑记录(持续更新版)

NLP学习与踩坑记录&#xff08;持续更新版&#xff09; OSError: Cant load tokenizer for bert-base-uncased.google.protobuf.message.DecodeError: Error parsing messageDeepspeed 本博客记录了博主在学习NLP时遇到了各种各样的问题与解决方法&#xff0c;供大家参考&#…...

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…...

微信小程序常用标签及其用法

大家好&#xff0c;我是linzi&#xff0c;今天我来给大家分享一下微信小程序一些个常用的标签及其用法 1. <view> 标签 <view> 标签是小程序中最常用的标签之一&#xff0c;用于组织和布局页面上的内容&#xff0c;类似于HTML中的 <div> 标签。 <view …...

开发查询订单信息fastGPT智能体工作流 将工作流接入到人工客服系统

我在抖音上发布了视频 https://www.douyin.com/video/7382446337482099977 下面是主要内容介绍 【视频标题&#xff1a;】开发查询订单信息fastGPT智能体工作流 将工作流接入到人工客服系统 #智能体 #FastGPT #客服系统-----------【视频行业分类&#xff1a;】<3C数码>-…...

Flink集群运行模式

我们了解了flink的一个集群的一个基础架构&#xff0c;包括里面核心的一些组件&#xff0c;比如说job manager&#xff0c;task manager等一些组件的一些主要的一些组成。本节课程开始我们学习flink的一个集群部署模式。首先我们来看一下flink集群部署模式究竟应该有哪一些种类…...

XSS 安全漏洞介绍及修复方案

简介 XSS&#xff08;Cross Site Scripting&#xff09;是一种常见的 Web 安全漏洞&#xff0c;攻击者通过在网页中注入恶意脚本代码&#xff0c;使得网页在用户端执行这些脚本&#xff0c;从而窃取用户信息或者进行其他恶意操作。为了防止 XSS 攻击&#xff0c;可以使用正则表…...

基于STM32的智能仓库管理系统

目录 引言环境准备智能仓库管理系统基础代码实现&#xff1a;实现智能仓库管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景&#xff1a;仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通过使用STM32嵌…...

LeetCode —— 只出现一次的数字

只出现一次的数字 I 本题依靠异或运算符的特性&#xff0c;两个相同数据异或等于0&#xff0c;数字与0异或为本身即可解答。代码如下: class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for (auto e : nums){ret ^ e;}return ret;} };只出…...

python遍历文件夹中所有图片

python遍历文件夹中的图片-CSDN博客 这个是之前的版本&#xff0c;现在这个版本会更好&#xff0c;直接进来就在列表中 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攻击是一种利用大量计算机或设备发起的分布式拒绝服务攻击。它的目标是通过发送大量流量或请求&#xff0c;使目标服务器或网络资源无法正常工作。高防IP是一种具有强大防御能力的网络服务&#xff0c;能够抵御各种形式的网络攻击&#xff0c;包括DDoS攻击。然而&#xff0…...

3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置

渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果&#xff0c;仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时&#xff0c;兼顾渲染速度和时间还需要进行一些调节设置&#xff0c;如何让渲染效果更加逼真&#xff1f; 一、全局照明与…...

Android的OverlayFS原理与作用

标签: OverlayFS; Android;Overlay Filesystem; Android的OverlayFS原理与作用 概述 OverlayFS(Overlay Filesystem)是一种联合文件系统,允许将一个或多个文件系统叠加在一起,使它们表现为一个单一的文件系统。Android系统利用OverlayFS来实现动态文件系统的叠加和管…...

奇点临近:人类与智能时代的未来

在信息爆炸的时代&#xff0c;我们每天都被海量的信息所淹没&#xff0c;如何才能在这个嘈杂的世界中找到真正有价值的信息&#xff1f;如何才能利用信息的力量&#xff0c;提升我们的认知水平&#xff0c;重塑我们的未来&#xff1f; 这些问题的答案&#xff0c;或许都能在雷…...

NAS教程丨铁威马如何登录 SSH终端?

适用型号&#xff1a; 所有TNAS 型号 如您有特殊操作需要通过 SSH 终端登录 TNAS&#xff0c;请参照以下指引&#xff1a; (注意: 关于以下操作步骤中的"cd /"的指令,其作用是使当前 SSH/Telnet 连接的位置切换到根目录,以免造成对卷的占用.请不要遗漏它.) Windows…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...