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

python实现onvif协议下控制摄像头变焦,以及融合人形识别与跟踪控制

#1024程序员节 | 征文#

     这两天才因为项目需要,对网络摄像头的视频采集以及实现人形识别与跟踪技术。对于onvif协议自然起先也没有任何的了解。但是购买的摄像头是SONY网络头是用在其他地方的。因为前期支持探究项目解决方案,就直接拿来做demo测试使用。

 先说说onvif协议:

Onvif,即Open Network Video Interface Forum ,可以译为开放型网络视频接口论坛,是安迅士、博世、索尼在2008年共同成立的一个国际性、开发型网络视频产品标准网络接口的开发论坛,后来由于这个技术开发论坛共同制定的开发型行业标准,就用该论坛的大写字母命名,即ONVIF 网络视频标准规范,习惯简称为:ONVIF协议。

Onvif协议的出现,解决了不同厂商之间开发的各类失败不能融合使用的难题,提供了统一的网络视频开发标准,即最终能够通过Onvif这个标准化的平台实现不同产品之间的集成。

测试

onvif Device test tool工具测试

python实现步骤

  1. 安装必要的库

    • 使用 pip install onvif 安装 ONVIF 库。
    • 根据人形识别所用的库进行安装,比如使用 pip install volo(假设使用 volo 进行人形识别)。
  2. 初始化 ONVIF 摄像头

    • 设置摄像头的 IP 地址、端口、用户名和密码等参数。
    • 创建 ONVIFCamera 对象并更新其地址。
    • 获取 PTZ(Pan/Tilt/Zoom)服务,用于控制摄像头的云台和变焦。
  3. 实现摄像头变焦控制

    • 定义变焦速度等参数。
    • 通过调用 PTZ 服务的相关方法实现拉近(zoom in)、拉远(zoom out)和停止变焦操作。
  4. 人形识别与跟踪

    • 使用选定的人形识别库加载模型并进行图像分析。
    • 在视频流中检测人形,获取人形的位置信息。
    • 根据人形位置调整摄像头的云台和变焦,实现跟踪。

完整代码

import cv2
import numpy as np
import serial
from onvif import ONVIFCamera
import time
import asyncio
from zeep import Client
import tkinter as tk
from threading import Thread
import logginglogging.basicConfig(level=logging.DEBUG)# 摄像头配置常量
CAMERA_IP = "192.168.0.132"
CAMERA_PORT = 8080
CAMERA_USERNAME = "admin"
CAMERA_PASSWORD = "admin123"# 串口配置常量
SERIAL_PORT = 'COM4'
BAUDRATE = 115200# 初始化串口
ser = serial.Serial(SERIAL_PORT, BAUDRATE)# 初始化摄像头
camera = None
try:camera = ONVIFCamera(CAMERA_IP, CAMERA_PORT, CAMERA_USERNAME, CAMERA_PASSWORD)camera.update_xaddrs()except Exception as e:logging.error(f"初始化摄像机错误: {e}")
# 获取 PTZ 服务
def get_ptz_service(camera):try:if camera:return camera.create_ptz_service()else:print("摄像机未初始化.")return Noneexcept Exception as e:print(f"PTZ 服务初始化错误: {e}")return None
ptz_service = get_ptz_service(camera)
# ONVIF摄像头设置
def get_stream_url():if camera:media_service = camera.create_media_service()return media_service.GetStreamUri({'StreamSetup': {'Stream': 'RTP-Unicast','Transport': {'Protocol': 'RTSP'}},'ProfileToken': camera.media.GetProfiles()[0].token}).Urielse:return None
async def process_video_async(cap):while True:ret, frame = cap.read()if not ret:print("视频读取失败")breakresized_frame = cv2.resize(frame, (899, 600))cv2.imshow('Video', resized_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakawait asyncio.sleep(0)def start_video_processing():stream_url = get_stream_url()if stream_url:cap = cv2.VideoCapture(stream_url)cap.set(cv2.CAP_PROP_FPS, 30)asyncio.run(process_video_async(cap))cap.release()else:print("无法获取视频流 URL。")
# 摄像头控制
class CameraControl:def __init__(self, ptz_service, camera):self.ptz_service = ptz_serviceself.zoom_speed = 0.1self.camera_profile_token = 'P2'def zoom_in(self):try:if self.camera_profile_token and 'P2':self.ptz_service.ContinuousMove({'ProfileToken': 'P2','Velocity': {'PanTilt': {'x': 0.0, 'y': 0.0},'Zoom': {'x': self.zoom_speed}}})print("拉近操作进行中")else:print("摄像头或 PTZ 服务未正确初始化。")except Exception as e:print(f"拉近操作失败:{e}")def zoom_out(self):try:if self.camera_profile_token and self.ptz_service:self.ptz_service.ContinuousMove({'ProfileToken': 'P2','Velocity': {'PanTilt': {'x': 0.0, 'y': 0.0},'Zoom': {'x': -self.zoom_speed} }})print("拉远操作进行中")else:print("摄像头或 PTZ 服务未正确初始化。")except Exception as e:print(f"拉远操作失败:{e}")def stop_zoom(self):try:if self.camera_profile_token and self.ptz_service:# 尝试不同的停止方法self.ptz_service.Stop({'ProfileToken': 'P2', 'PanTilt': True, 'Zoom': True})print("停止变焦操作")else:print("摄像头或 PTZ 服务未正确初始化。")except Exception as e:print(f"停止变焦失败:{e}")# 创建 GUI
class CameraApp:def __init__(self, master, camera_control):self.master = mastermaster.title("Camera Control")self.camera_control = camera_controlself.zoom_in_button = tk.Button(master, text="拉近", command=self.camera_control.zoom_in)self.zoom_in_button.pack()self.zoom_out_button = tk.Button(master, text="拉远", command=self.camera_control.zoom_out)self.zoom_out_button.pack()self.stop_button = tk.Button(master, text="停止变焦", command=self.camera_control.stop_zoom)self.stop_button.pack()self.quit_button = tk.Button(master, text="退出", command=self.quit)self.quit_button.pack()def quit(self):self.camera_control.stop_zoom()if ser.is_open:ser.close()self.master.quit()
if __name__ == "__main__":# 启动视频处理线程video_thread = Thread(target=start_video_processing)video_thread.start()# 创建摄像头控制实例if camera and ptz_service:camera_control = CameraControl(ptz_service, camera)else:print("无法创建摄像头控制实例,摄像头或 PTZ 服务未正确初始化。")# 启动 GUIroot = tk.Tk()if camera_control:app = CameraApp(root, camera_control)else:print("无法启动 GUI,摄像头控制实例未创建。")root.mainloop()

   

相关文章:

python实现onvif协议下控制摄像头变焦,以及融合人形识别与跟踪控制

#1024程序员节 | 征文# 这两天才因为项目需要,对网络摄像头的视频采集以及实现人形识别与跟踪技术。对于onvif协议自然起先也没有任何的了解。但是购买的摄像头是SONY网络头是用在其他地方的。因为前期支持探究项目解决方案,就直接拿来做demo测试使用。 …...

【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用

上篇文章: 【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间&…...

【C++】红黑树万字详解(一文彻底搞懂红黑树的底层逻辑)

目录 00.引入 01.红黑树的性质 02.红黑树的定义 03.红黑树的插入 1.按照二叉搜索树的规则插入新节点 2.检测新节点插入后,是否满足红黑树的性质 1.uncle节点存在且为红色 2.uncle节点不存在 3.uncle节点存在且为黑色 04.验证红黑树 00.引入 和AVL树一样&am…...

开源FluentFTP实操,操控FTP文件

概述:通过FluentFTP库,轻松在.NET中实现FTP功能。支持判断、创建、删除文件夹,判断文件是否存在,实现上传、下载和删除文件。简便而强大的FTP操作,提升文件传输效率。 在.NET中,使用FluentFTP库可以方便地…...

论文解读 | ECCV2024 AutoEval-Video:一个用于评估大型视觉-语言模型在开放式视频问答中的自动基准测试...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 陈修元,上海交通大学清源研究院硕士生 概述 总结来说,我们提出了一个新颖且具有挑战性的基准测试AutoEvalVideo,用于全…...

postgresql14主从同步流复制搭建

1. 如果使用docker搭建请移步 Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南_docker安装postgresql主从同步-CSDN博客 2. 背景 pgsql版本:PostgreSQL 14.13 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4…...

企业信息化管理中的数据集成方案:销售出库单对接

企业信息化管理中的数据集成方案:销售出库单对接 销售出库单旺店通→金蝶:高效数据集成案例分享 在企业信息化管理中,数据的高效流动和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例:如何将旺店通…...

3.cpp基本数据类型

cpp基本数据类型 1.cpp基本数据类型 1.cpp基本数据类型 C基本数据类型和C语言的基本数据类型差不多 注意bool类型&#xff1a;存储真值 true 或假值 false&#xff0c;C语言编译器C99以上支持。 C语言的bool类型&#xff1a;要添加 #include <stdbool.h>头文件 #includ…...

MCK主机加固与防漏扫的深度解析

在当今这个信息化飞速发展的时代&#xff0c;网络安全成为了企业不可忽视的重要议题。漏洞扫描&#xff0c;简称漏扫&#xff0c;是一种旨在发现计算机系统、网络或应用程序中潜在安全漏洞的技术手段。通过自动化工具&#xff0c;漏扫能够识别出系统中存在的已知漏洞&#xff0…...

《软件估算之原始功能点:精准度量软件规模的关键》

《软件估算之原始功能点&#xff1a;精准度量软件规模的关键》 一、软件估算的重要性与方法概述二、原始功能点的构成要素&#xff08;一&#xff09;数据功能&#xff08;二&#xff09;事务功能 三、原始功能点的估算方法&#xff08;一&#xff09;功能点分类估算&#xff0…...

序列化与反序列化

序列化和反序列化是数据处理中的两个重要概念&#xff0c;它们在多种场景下都非常有用&#xff0c;尤其是在分布式系统、网络通信、持久化存储等方面。下面是对这两个概念的详细解释&#xff1a; 序列化&#xff08;Serialization&#xff09; 定义&#xff1a;序列化是将对象…...

安装nginx实现多ip访问多网站

[rootlocalhost ~]# systemctl stop firewalld 关防火墙 [rootlocalhost ~]# setenforce 0 关selinux [rootlocalhost ~]# mount /dev/sr0 /mnt 挂载点 [rootlocalhost ~]# dnf install nginx -y 安装nginx [rootlocalhost ~]# nmtui 当前主机添加多地址 [rootlocal…...

每日回顾:简单用C写 冒泡排序、快速排序

冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过重复遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行直到没有再需要交换&#xff0c;也就是说该数列已…...

前端_007_Axios库

文章目录 配置响应结构拦截器 引入&#xff1a; 官网&#xff1a; https://www.axios-http.cn/ 一句话简介&#xff1a;浏览器里基于XmlHttpRequests&#xff0c;node.js里基于http模块封装的网络请求库&#xff0c;使用非常方便 //通用例子axios({method:post,url: request…...

NAND FLASH 与 SPI FLASH

面试的时候再有HR针对从数据手册开始做&#xff0c;直接说明&#xff1a;例如RK3588等高速板设计板都有设计指导书&#xff0c;基本把对应的DDR等型号和布局规范都说明&#xff0c;或者DCDC电路直接给一个典型设计原理图&#xff0c;或者BMS更加经典&#xff0c;原理图给的是最…...

QTCreator打不开双击没反应

问题描述 双击后进程里显示有,当过几秒直接消失 解决 找到C\用户\AppData\Roaming\QtProject&#xff0c;删除目录下QtCreator.ini文件&#xff08;这会重置QtCreator的默认设置&#xff09;&#xff0c;再打开QtCreator时会自动生成对应于默认设置的QtCreator.ini文件&…...

vue npm run ...时 报错-系统找不到指定的路径

vue项目修改时&#xff0c;不知道那一步操作错误了&#xff0c;运行npm run …时报错 系统找不到指定的路径&#xff0c;对此进行记录一下&#xff01; 解决方法&#xff1a; 1、执行 npm install 命令&#xff0c;重新下载模块 2、根据下方提示执行 npm fund 查看详细信息 …...

54页可编辑PPT | 大型集团企业数据治理解决方案

这份PPT是关于大型集团企业数据治理的全面解决方案&#xff0c;它详细介绍了数据治理的背景、需求、管理范围、框架、解决思路&#xff0c;以及数据治理在实际操作中的关键步骤。内容涵盖了数据架构、数据质量、数据应用等方面的问题&#xff0c;并提出了数据资产透视、智能搜索…...

STM32嵌入式移植GmSSL库

前言 最近在做一个换电柜的项目&#xff0c;需要和云端平台对接json协议&#xff0c;由于服务端规定了&#xff0c;需要采用sm2 sm3 sm4用来加密。在嵌入式方面只能用北京大学的GmSSL了。 下载GmSSL 在https://github.com/guanzhi/GmSSL下载库 也可以通过git命令下载&#x…...

【mod分享】极品飞车10高清模组,,全新道路,全新建筑,高清植被,全新的道路围栏,全新的天空,画质直逼极品飞车20。支持光追

各位好&#xff0c;今天小编给大家带来一款新的高清重置魔改MOD&#xff0c;本次高清重置的游戏叫《极品飞车10卡本峡谷》。 《极品飞车10&#xff1a;卡本峡谷》该游戏可选择四个模式&#xff1a;生涯、快速比赛、挑战赛、多人连线游戏模式&#xff08;已不可用&#xff09;&…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...