当前位置: 首页 > 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…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...