opencv使用KCF算法跟踪目标,给出目标中心位置

news2024/11/28 3:30:13

效果图

代码

import cv2

class VideoTracker:
    def __init__(self, video_path: str):
        self.video_path = video_path
        self.cap = cv2.VideoCapture(video_path)
        self.tracker = cv2.legacy.TrackerKCF_create()
        self.initBB = None
        self.tracker_initialized = False
        self.selecting = False
        self.frame = None
        self.paused = False
        self.tracking_started = False
        self.frame_skip = 2  # Adjusted for better tracking continuity

    def select_roi(self, event, x, y, flags, param):
        """ Handle mouse events for ROI selection. """
        if event == cv2.EVENT_LBUTTONDOWN:
            self.initBB = (x, y, 0, 0)
            self.selecting = True
        elif event == cv2.EVENT_MOUSEMOVE and self.selecting:
            self.initBB = (self.initBB[0], self.initBB[1], x - self.initBB[0], y - self.initBB[1])
            self.frame_copy = self.frame.copy()
            cv2.rectangle(self.frame_copy, (self.initBB[0], self.initBB[1]), (x, y), (255, 0, 0), 2)
            cv2.imshow('Video', self.frame_copy)
        elif event == cv2.EVENT_LBUTTONUP:
            self.initBB = (self.initBB[0], self.initBB[1], x - self.initBB[0], y - self.initBB[1])
            self.selecting = False
            if self.initBB[2] > 0 and self.initBB[3] > 0:
                self.tracker.init(self.frame, self.initBB)
                self.tracker_initialized = True
                self.tracking_started = True

    def process_frame(self):
        """ Process frames for object tracking. """
        frame_counter = 0
        while self.cap.isOpened():
            ret, frame = self.cap.read()
            if not ret:
                break

            if frame_counter % (self.frame_skip + 1) == 0:
                self.frame = frame.copy()
                if self.tracking_started:
                    if self.tracker_initialized:
                        success, bbox = self.tracker.update(self.frame)
                        if success:
                            (x, y, w, h) = [int(v) for v in bbox]
                            center_x, center_y = int(x + w / 2), int(y + h / 2)
                            cv2.rectangle(self.frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
                            cv2.circle(self.frame, (center_x, center_y), 5, (0, 0, 255), -1)
                            cv2.putText(self.frame, f"Center: ({center_x}, {center_y})", (center_x + 10, center_y - 10),
                                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 2)
                        else:
                            # Tracker failed, try re-initializing
                            self.tracker_initialized = False
                            self.tracking_started = False
                    if not self.tracking_started:
                        # Optionally, re-select ROI here if desired
                        pass
                cv2.imshow('Video', self.frame)

            frame_counter += 1
            key = cv2.waitKey(1) & 0xFF
            if key == ord('q'):
                break
            elif key == ord(' '):  # Space key to pause/resume
                self.paused = not self.paused
            elif key == ord('s') and not self.selecting and not self.tracking_started:
                if self.initBB:
                    self.tracker.init(self.frame, self.initBB)
                    self.tracker_initialized = True
                    self.tracking_started = True

        self.cap.release()
        cv2.destroyAllWindows()

    def start(self):
        """ Start the video tracking process. """
        cv2.namedWindow('Video')
        cv2.setMouseCallback('Video', self.select_roi)

        # Read the first frame and let the user select the ROI
        ret, self.frame = self.cap.read()
        if not ret:
            print("Error: Unable to read video file.")
            return

        self.frame_copy = self.frame.copy()
        cv2.imshow('Video', self.frame)
        print("Select ROI and press 's' to start tracking.")
        cv2.waitKey(0)  # Wait for the user to select ROI

        self.process_frame()

if __name__ == '__main__':
    video_path = 'ego-planner户外飞行测试.mp4'  # 修改为你的实际视频路径
    if not video_path:
        print("Error: No video path provided.")
    else:
        tracker = VideoTracker(video_path)
        tracker.start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何进行小程序的调试

Errno错误码 在使用部分小程序 API / 组件时,抛出的异常(fail 回调 / Promise reject)Error 对象中除了带有 errMsg,还会带有通用错误码 errno。 代码示例 wx.openBluetoothAdapter({success (res) {console.log(res)}fail (er…

时间序列分析方法之 -- 指数平滑(Exponential Smoothing)

目录 原理 适用情况 Python 示例代码 结论 原理 指数平滑(Exponential Smoothing)是一种用于时间序列分析和预测的平滑技术。与简单移动平均(SMA)和加权移动平均(WMA)不同,指数平滑通过对最…

VS+opencv+环境配置

下载opencv库。 版本 - OpenCV 下载完了是一个exe文件,(可以更换目录)直接双击,也就是压缩。 vs配置: 调试-调试属性 点编辑,加入这两个,路径根据自己的opencv库 3、链接器 测试:…

《Java初阶数据结构》----8.<java对象的比较总结>

目录 前言 一、Java对象的比较 1.1基本类型的比较 1.2 对象比较的问题(与equals) 1.3对象的比较 (三种常用方式) 1.重写equals方法 2.基于Comparble接口类的比较 3.基于比较器比较(Comparator接口) …

如何在网站嵌入可填写的PDF表单:2024巴黎奥运会赛程

如何将可填写的 PDF 表单嵌入您的网页?访问者无需下载或注册即可查看并填写。 简单!本文以2024巴黎奥运会赛程表单为例,演示如何将其嵌入网页中。您可以在 ONLYOFFICE 表单库免费获取该模板,有白色和紫色两种背景设计。 如何在网站…

uniapp中出现图片过小会与盒子偏离

结论&#xff1a;在image的父盒子中加上display: flex&#xff0c;原因不清楚 出问题的代码和图片如下&#xff1a; <template><view style" background-color: greenyellow; height: 10rpx;width: 10rpx;"><image :src"imgSrc.seatnull" …

UCOS-III 任务调度锁定/解锁接口OSSchedLock/Unlock详解

在实时操作系统中&#xff0c;任务调度是系统实现多任务并发执行的核心机制。但在某些场景下&#xff0c;我们需要临时关闭任务调度&#xff0c;以确保某段代码在执行过程中不被打断。下面将详细介绍这两个接口的应用场景及实现原理。 1. 关闭调度的应用场景 关闭任务调度的主要…

Windows环境下部署本地大模型教程

自ChatGPT在2022年爆发式出圈以来&#xff0c;大模型对人类世界产生了重大影响&#xff0c;无论是在生产、工作、写作方面还是自动驾驶领域&#xff0c;大模型发挥了非常重要的作用。 现各大厂&#xff0c;无论是国内大厂还是国外大厂&#xff0c;都纷纷推出了自己的对话大模型…

服务暴露 traefik

一。traefik 部署 前置资源 还是那个网站&#xff0c;这里复制 entryPoints&#xff0c;进入traefik的大门 可选在哪台机器上部署 traefik 部署 用 Daemonset 的方式是为了&#xff0c;加机器到集群后&#xff0c;能自动部署traefik 到目标机器 注意 8084端口 必须加…

【JVM基础06】——组成-直接内存详解

目录 1- 引言&#xff1a;直接内存概述1-1 直接内存是什么&#xff1f;直接内存的定义(What)1-2 为什么用直接内存&#xff1f;Java程序对直接内存的使用 (Why) 2- ⭐核心&#xff1a;详解直接内存(How)2-1 文件拷贝案例介绍对比常规 IO(BIO) 和 NIO常规 IO 的操作流程NIO 的操…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组&#xff0c;存储指定长度的字符序列&#xff0c;数组中的每个元素都是一个char类型的变量&#xff0c;如&#xff1a; char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…

[Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升

信息收集 IP AddressOpening Ports192.168.101.160TCP:22,80,111,46606 $ nmap -p- 192.168.101.160 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u4 (protocol 2.0) | ssh-hostkey: | 1024 26:81:c1:f…

拉提查合创5步玩转git工具协作代码开发

1 工具使用场景 开发团队使用git版本管理工具&#xff0c;进行协作代码开发过程中&#xff0c;最常用的场景为&#xff1a; &#xff08;1&#xff09;拉取代码 将git远端仓库最新代码拉取到本地。 &#xff08;2&#xff09;提交代码 将本地新增修改的代码提交至git远端仓库中…

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下&#xff0c;处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发&#xff0c;统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体&#xff0c;并分享…

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下&#xff0c;天气气温的变化已经对人们的生活各方面都产生了影响&#xff0c;人们在外出时大多都会在手机上看看天气如何&#xff0c;根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…

C++基础知识:函数重载相关注意事项:1.引用作为重载条件,2.2.函数重载遇见函数默认参数。

1.引用作为重载条件 #include<iostream>using namespace std;//1.引用作为重载的条件 //int 和 const int 类型不同&#xff0c;所以可以作用重载条件 void fn(int &a) //int &a10;不合法 //10放在了常量区&#xff0c;而引用要么在栈区&#xff0c;要么在堆区{…

mysql的MHA以及故障模拟

目录 MHA概念 MHA的组件 MHA的特点 实验&#xff1a;搭建完成MHA的架构 实验&#xff1a;主备切换 实验结果 实验&#xff1a;故障切换 实验&#xff1a;故障恢复 MHA概念 MHA&#xff1a;高可用模式下的故障切换&#xff0c;基于主从复制。它解决的是单点故障和主从复…

Ruby、Python、Java 开发者必备:Codigger之软件项目体检

在编程的广阔天地里&#xff0c;Ruby、Python 和 Java 开发者们各自凭借着独特的语言特性&#xff0c;构建着精彩纷呈的应用世界。然而&#xff0c;无论使用哪种语言&#xff0c;确保项目的高质量始终是至关重要的目标。而 Codigger 项目体检则成为了实现这一目标的得力助手&am…

【JS】事件循环

事件循环&#xff08;Event Loop&#xff09; 什么是事件循环 事件循环就是一个执行任务队列的机制 为什么会出现事件循环 为了避免单线程出现阻塞,采用了异步的形式执行任务。为了解决异步任务的问题,采用了事件循环机制。 事件循环的流程 JavaScript是一门单线程的语言…