当前位置: 首页 > 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()

   

http://www.lryc.cn/news/467754.html

相关文章:

  • 【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用
  • 【C++】红黑树万字详解(一文彻底搞懂红黑树的底层逻辑)
  • 开源FluentFTP实操,操控FTP文件
  • 论文解读 | ECCV2024 AutoEval-Video:一个用于评估大型视觉-语言模型在开放式视频问答中的自动基准测试...
  • postgresql14主从同步流复制搭建
  • 企业信息化管理中的数据集成方案:销售出库单对接
  • 3.cpp基本数据类型
  • MCK主机加固与防漏扫的深度解析
  • 《软件估算之原始功能点:精准度量软件规模的关键》
  • 序列化与反序列化
  • 安装nginx实现多ip访问多网站
  • 每日回顾:简单用C写 冒泡排序、快速排序
  • 前端_007_Axios库
  • NAND FLASH 与 SPI FLASH
  • QTCreator打不开双击没反应
  • vue npm run ...时 报错-系统找不到指定的路径
  • 54页可编辑PPT | 大型集团企业数据治理解决方案
  • STM32嵌入式移植GmSSL库
  • 【mod分享】极品飞车10高清模组,,全新道路,全新建筑,高清植被,全新的道路围栏,全新的天空,画质直逼极品飞车20。支持光追
  • 使用U-KAN训练自己的数据集 — 医疗影像分割
  • 游戏盾在防御DDoS与CC攻击中的作用与实现
  • 为什么说红帽认证(RHCE)是网络工程师的万金油证书?
  • 89.【C语言】编译和链接
  • 优秀学员统计
  • 电脑程序变化监控怎么设置?实时监控电脑程序变化的五大方法,手把手教会你!
  • 2.1.3 编码和调制(下)
  • 【网络安全渗透测试入门】之XSS漏洞检测、利用和防御机制XSS游戏(非常详细)收藏这一篇就够了!
  • [ComfyUI]Flux:超赞古风少女LORA,唯美江南水乡小桥流水轻舟江南美人
  • 从蚂蚁金服面试题窥探STW机制
  • 【MySQL数据库】MySQL高级语句(SQL语句进阶版)