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

视频流画线 视频流画多边形

目录

四边形:

视频流画多边形:


四边形:


import cv2
import json
import av# 全局变量
polygon_points = []      # 四边形点
current_pos = None       # 鼠标当前位置
finished = False         # 是否完成绘制# ------------------------------------------
# 鼠标绘制四边形回调函数
# ------------------------------------------
def mouse_draw_quad(event, x, y, flags, param):global polygon_points, current_pos, finishedif finished:returnif event == cv2.EVENT_LBUTTONDOWN:# 点击添加一个点if len(polygon_points) < 4:polygon_points.append((x, y))print(f"添加点: {polygon_points[-1]}")# 4 个点完成 → 自动闭合if len(polygon_points) == 4:polygon_points.append(polygon_points[0])print("✅ 四边形完成:", polygon_points)finished = Trueelif event == cv2.EVENT_MOUSEMOVE:current_pos = (x, y)# ------------------------------------------
# 保存四边形到 JSON
# ------------------------------------------
def save_quad_json(points, filename="roi.json"):if len(points) < 4:print("⚠️ 点不足 4 个,不保存")returndata = {"polygon": [{"x": p[0], "y": p[1]} for p in points]}with open(filename, "w", encoding="utf-8") as f:json.dump(data, f, indent=4, ensure_ascii=False)print("✅ ROI 已保存到:", filename)# ------------------------------------------
# RTSP 绘制四边形主函数
# ------------------------------------------
def draw_quad_rtsp(rtsp_url, filename="roi.json"):global polygon_points, current_pos, finished# 打开 RTSP 视频container = av.open(rtsp_url, timeout=8)stream = next(s for s in container.streams if s.type == 'video')window = "Draw Quad ROI"cv2.namedWindow(window)cv2.setMouseCallback(window, mouse_draw_quad)print("🎬 进入四边形绘制模式:")print("✅ 左键点击 4 次画四边形")print("✅ 第 4 个点自动闭合并保存")print("✅ 按 Q 退出")for packet in container.demux(stream):if finished:breakfor frame in packet.decode():img = frame.to_ndarray(format='bgr24')img = cv2.resize(img, (960, 544))# 绘制已有点for p in polygon_points:cv2.circle(img, p, 4, (0, 255, 0), -1)# 绘制线段if len(polygon_points) > 1:for i in range(len(polygon_points) - 1):cv2.line(img, polygon_points[i], polygon_points[i + 1], (0, 255, 0), 2)# 鼠标预览线if current_pos and 0 < len(polygon_points) < 4:cv2.line(img, polygon_points[-1], current_pos, (0, 255, 255), 1)cv2.imshow(window, img)if cv2.waitKey(1) == ord("q"):finished = Truebreakcv2.destroyAllWindows()# 保存结果if len(polygon_points) >= 4:save_quad_json(polygon_points, filename)return polygon_pointsdef save_quad_json(points, filename="roi.json"):# points 形式为:p1, p2, p3, p4, p1(最后一个是闭合点)if len(points) < 4:print("⚠️ 点不足 4 个,不保存")return# ✅ 去掉重复的闭合点if len(points) == 5 and points[0] == points[-1]:points = points[:-1]  # 去掉最后一个data = {"polygon": [{"x": p[0], "y": p[1]} for p in points]}with open(filename, "w", encoding="utf-8") as f:json.dump(data, f, indent=4, ensure_ascii=False)print("✅ ROI 已保存到:", filename)if __name__ == "__main__":rtsp = "rtsp://admin:Zenking306$@192.168.8.240:554/unicast/c5/s0/live"points = draw_quad_rtsp(rtsp)print("绘制结果:", points)save_quad_json(points,filename="roi.json")

视频流画多边形:

import cv2
import json
import av
import time# -----------------------------
# 全局变量(鼠标交互)
# -----------------------------
polygon_points = []      # 保存多边形顶点
current_pos = None       # 鼠标当前坐标(用于预览)
finished = False         # 是否完成绘制def mouse_draw_polygon(event, x, y, flags, param):global polygon_points, current_pos, finishedif finished:returnif event == cv2.EVENT_LBUTTONDOWN:# 添加一个多边形点polygon_points.append((x, y))print("添加点:", (x, y))elif event == cv2.EVENT_RBUTTONDOWN:# 删除最近一个点if polygon_points:removed = polygon_points.pop()print("删除点:", removed)elif event == cv2.EVENT_MOUSEMOVE:current_pos = (x, y)def save_polygon_json(points, filename="polygon.json"):data = {"polygon": [{"x": p[0], "y": p[1]} for p in points]}with open(filename, "w", encoding="utf-8") as f:json.dump(data, f, indent=4, ensure_ascii=False)print("✅ 已保存多边形 ROI 为:", filename)# ----------------------------------------
# RTSP 视频读取 + 多边形绘制主函数
# ----------------------------------------
def draw_polygon_roi_rtsp(rtsp_url, window_name="RTSP Polygon ROI"):global polygon_points, current_pos, finishedcontainer = av.open(rtsp_url, timeout=10)video_stream = next(s for s in container.streams if s.type == 'video')cv2.namedWindow(window_name)cv2.setMouseCallback(window_name, mouse_draw_polygon)print("🎥 开始显示 RTSP 视频,左键添加点,右键删除点,按 Enter 完成多边形。")for packet in container.demux(video_stream):if finished:breakfor frame in packet.decode():img = frame.to_ndarray(format='bgr24')img = cv2.resize(img, (960, 544))# 显示多边形点for p in polygon_points:cv2.circle(img, p, 4, (0, 255, 0), -1)# 展示动态连线if len(polygon_points) > 0:for i in range(len(polygon_points) - 1):cv2.line(img, polygon_points[i], polygon_points[i+1], (0, 255, 0), 2)# 鼠标移动预览if current_pos is not None:cv2.line(img, polygon_points[-1], current_pos, (0, 255, 255), 1)cv2.imshow(window_name, img)key = cv2.waitKey(1)if key == 13:  # Enter 键if len(polygon_points) >= 3:finished = Trueprint("✅ 绘制完成")else:print("⚠️ 至少需要 3 个点")breakelif key == ord('q'):print("退出")finished = Truebreakcv2.destroyAllWindows()if finished and len(polygon_points) >= 3:# 闭合多边形(可选)polygon_points.append(polygon_points[0])save_polygon_json(polygon_points)return polygon_pointsreturn None
if __name__ == "__main__":rtsp = "rtsp://admin:Zenking306$@192.168.8.240:554/unicast/c5/s0/live"polygon = draw_polygon_roi_rtsp(rtsp)if polygon:print("最终多边形 ROI 点:", polygon)

http://www.dtcms.com/a/577243.html

相关文章:

  • TinyTroupe:微软开源的轻量级多智能体“人格”模拟库(一)
  • 【计算机组成原理】计算机系统概述:从发展历程到工作原理
  • DOM Text
  • ARM《10》_01_字符设备驱动基础、学习开发字符驱动内核程序、总结规律和模板
  • 从灵光到落地:用 ModelEngine 可视化编排「会议纪要智能体」——全程 0 代码,2 小时上线!
  • FastAPI 基础入门-章节五(Pydantic的使用)
  • C/C++图形库_EasyX 环境配置(VSCode+MinGW )
  • 优化网站关键词优化page wordpress
  • 简单并完全免费的方法-让夸克网盘不限速下载
  • Vue 指令系统深度解析:条件渲染的艺术(v-if/v-else-if/v-else 与 v-show 的实战指南)
  • 【Linux】Reactor反应堆模式
  • iOS 上架费用全解析 开发者账号、App 审核、工具使用与开心上架(Appuploader)免 Mac 成本优化指南
  • SCADA升级详解5 | SCADA业务报表,优化资源与决策支持
  • 【Python3教程】Python3高级篇之operator模块
  • 同德县wap网站建设公司温州购物网络商城网站设计制作
  • 新晋社区之星何晨阳:从使用者到贡献者,我是如何理解并反哺开源?
  • Spring 框架整合 JUnit 单元测试
  • 鸿蒙PC使用aarch64的原因分析
  • 【Java】Java 中函数作为参数传递详解
  • 企业网站备案费用英文案例网站
  • 乐迪信息:采煤机状态如何?AI摄像机远程智能识别,故障早发现
  • 4.2.3 指令的寻址方式【2010统考真题】
  • 大三程序猿的刷题日常 Day 5
  • Java基础复习-下-多线程-网络编程-反射
  • 便携软件注册器:让便携版的软件秒变默认程序
  • 知识体系(四)Agent
  • 48 进 48 出纯音频矩阵:大型场景音频调度的技术革新与应用实践
  • 男女做暖暖的试看网站漫画网站图片一般多大
  • 萤石开放平台机器人音视频对接流程
  • 站长之家特效网站wordpress 端口号