目标跟踪——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…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...