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

openvino yolov5/ssd 实时推流目标检测在html上显示

安装ffmepg并添加到环境变量中,流媒体使用m7s

运行效果 SSD:检测在10ms左右,yolov5在100ms左右

app.py

#!/usr/local/bin/python3
# encodin: utf-8import subprocess
import threading
import time
import cv2
import osfrom OpenVinoYoloV5Detector import OpenVinoYoloV5Detector
from OpenVinoSSDDetector import OpenVinoSSDDetectorclass RTSCapture(cv2.VideoCapture):_cur_frame = None_reading = False_frame1 = None# 视频播放质量 值越大越模糊# _quality = 2.5  # 1;1.5;2;2.5# _interval_check = 1000  # 检测间隔 0 不跳帧 1秒10帧_quality = 1_interval_check = 0_recvtime = 0@staticmethoddef get_even(num):if (num % 2) != 0:num = num + 1return num@staticmethoddef create(srcstream, dststream):rtscap = RTSCapture(srcstream)rtscap.frame_receiver = threading.Thread(target=rtscap.recv_frame, daemon=True)rtscap.frame_processer = threading.Thread(target=rtscap.prcoess_frame, daemon=True)rtscap.frame_sender = threading.Thread(target=rtscap.send_frame, daemon=True)fps = int(rtscap.get(cv2.CAP_PROP_FPS))rtscap.width = rtscap.get_even(int(rtscap.get(cv2.CAP_PROP_FRAME_WIDTH) / rtscap._quality))rtscap.height = rtscap.get_even(int(rtscap.get(cv2.CAP_PROP_FRAME_HEIGHT) / rtscap._quality))rtscap.command = ['G:\\ZLMediaKit_Release\\ffmpeg.exe','-y','-f', 'rawvideo','-vcodec', 'rawvideo','-pix_fmt', 'bgr24','-s', "{}x{}".format(rtscap.width, rtscap.height),'-r', str(fps),'-i', '-','-c:v', 'libx264','-pix_fmt', 'yuv420p','-preset', 'ultrafast','-f', 'rtsp',  # flv rtsp'-rtsp_transport', 'udp',  # 使用TCP推流,linux中一定要有这行dststream]# 管道配置rtscap._reading = True# 加载算法rtscap.box_color = (0, 255, 0)# yolov5# conf = {#     # "weight_file": "weights/yolov5n_openvino_model/yolov5n.xml",#     "weight_file": "weights/yolov5n_openvino_model/yolov5n.xml",#     "device": "CPU"# }# rtscap.detector = OpenVinoYoloV5Detector(IN_conf=conf)#ssdconf = {"model_xml": "./weights/ssdlite_mobilenet_v2/FP16/ssdlite_mobilenet_v2.xml","model_bin": "./weights/ssdlite_mobilenet_v2/FP16/ssdlite_mobilenet_v2.bin","device": "CPU"}rtscap.detector = OpenVinoSSDDetector(IN_conf=conf)return rtscapdef get_milsecond(self):t = time.time()return (int(round(t * 1000)))def isOK(self):status = self.isOpened() and self._readingreturn statusdef recv_frame(self):while self.isOK():time.sleep(0.01)ok, frame = self.read()if not ok:breakself._cur_frame = frame#self.p.stdin.write(frame.tostring())self._reading = Falsedef prcoess_frame(self):while self.isOK():time.sleep(0.01)try:ok, frame = self.read_latest_frame()if not ok:continue# 算法解析# 跳帧检测if self.get_milsecond() - self._recvtime > self._interval_check:starttime = self.get_milsecond()detect_num, detect_data = self.detector.detect(frame)if len(detect_data):for m in detect_data:classname = m.get('class_name')score = m.get('score')location = m.get('location')box_l, box_t = int(location.get('x1')), int(location.get('y1'))box_r, box_b = int(location.get('x2')), int(location.get('y2'))frame = cv2.rectangle(frame, (box_l, box_t), (box_r, box_b), self.box_color, 2)frame = cv2.putText(frame, classname, (box_l, box_t + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)self._recvtime = self.get_milsecond()endtime  = self.get_milsecond();print('检测耗时:' + str(endtime - starttime))self._frame1 = cv2.resize(frame, (self.width, self.height)) # 图像压缩#self.p.stdin.write(frame1.tostring())except Exception as e:ss = str(e)def send_frame(self):timeout = 3self.p = subprocess.Popen(self.command, shell=False, stdin=subprocess.PIPE)while self.isOK():time.sleep(0.01)try:if  self._frame1 is not None:self.p.stdin.write(self._frame1.tostring())except Exception as e:ss = str(e)def read2(self):frame = self._cur_frameself._cur_frame = Nonereturn frame is not None, framedef start_read(self):self.frame_receiver.start()self.frame_processer.start()self.frame_sender.start()self.read_latest_frame = self.read2 if self._reading else self.readdef stop_read(self):self._reading = Falseif self.frame_receiver.is_alive():self.frame_receiver.join()if self.frame_processer.is_alive():self.frame_processer.join()if self.frame_sender.is_alive():self.frame_sender.join()if __name__ == '__main__':url = src = '0'if src.isdigit():url = int(src)rtscap1 = RTSCapture.create(url, "rtsp://127.0.0.1:554/live/test0")  # test.mp4 0rtscap1.start_read()os.system('pause')

相关文章:

openvino yolov5/ssd 实时推流目标检测在html上显示

安装ffmepg并添加到环境变量中,流媒体使用m7s 运行效果 SSD:检测在10ms左右,yolov5在100ms左右 app.py #!/usr/local/bin/python3 # encodin: utf-8import subprocess import threading import time import cv2 import osfrom OpenVinoYoloV…...

基于FPGA的 SPI通信 设计(1)

引言 低速通信目前搞过 UART串口通信、IIC通信。其实 SPI 也算是中低速(有时也可以用作高速通信)串行通信的范畴,但是一直还没真正实现过,所以此系列就 SPI的协议以及FPGA设计作几篇博客记录。欢迎订阅关注~ SPI 标准协议 x1模式…...

为什么西门子、美的等企业这样进行架构升级,看看改造效果就知道了

在工业领域, 生产、测试、运行阶段都可能会产生大量带有时间戳的传感器数据,这都属于典型的时序数据。时序数据主要由各类型实时监测、检查与分析设备所采集或产生,涉及制造、电力、化工、工程作业等多个行业,具备写多读少、量非常…...

open3d点云配准函数registration_icp

文章目录基本原理open3d调用绘图基本原理 ICP, 即Iterative Closest Point, 迭代点算法。 ICP算法有多种形式,其中最简单的思路就是比较点与点之间的距离,对于点云P{pi},Q{qi}P\{p_i\}, Q\{q_i\}P{pi​},Q{qi​}而言,如果二者是同一目标&am…...

HTML编码规范

本篇文章是基于王叨叨大佬师父维护的文档梳理的,有兴趣可以去看一下原文HTML编码规范。 1. 缩进与换行 【建议】 使用 2 个空格作为一个缩进层级,不允许使用tab字符 解释: ​ 具体项目,可以使用2个空格,也可以使用…...

PDF SDK for Linux 8.4.2 Crack

PDF SDK for Linux 是适用于任何 Linux 企业或云应用程序的强大解决方案,非常适合需要完全可定制的 PDF 查看器或后端流程的任何 Linux 开发人员。 将 Foxit PDF SDK 嵌入到基于 Linux 的应用程序中非常容易。只需打开您最喜欢的 Linux IDE,复制您需要的…...

vb 模块和作用域的关系

模块在VB中有三种类型的模块,分别是窗体模块、标准模块和类模块。窗体模块窗体模块中包含了窗体以及窗体中所有控件的事件过程,文件扩展名为(*.frm),窗体文件中不仅包含窗体对象的外观设计,也包含窗体模块(…...

Redis分布式锁

一、背景 与分布式锁相对应的是「单机锁」,我们在写多线程程序时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来「互斥」,以保证共享变量的正确性,其使用范围是在「同一个进程」中。单机环境下&#xff0…...

京东前端经典面试题整理

img的srcset属性的作⽤&#xff1f; 响应式页面中经常用到根据屏幕密度设置不同的图片。这时就用到了 img 标签的srcset属性。srcset属性用于设置不同屏幕密度下&#xff0c;img 会自动加载不同的图片。用法如下&#xff1a; <img src"image-128.png" srcset&qu…...

django+mysql实现一个简单的web登录页面

目录 一、使用pyacharm创建一个django项目 二、启动django项目验证 三、配置mysql数据库 1、本地安装mysql数据库 1&#xff09;安装mysql数据库 2&#xff09;自己创建一个数据库 2、安装 pymysql 3、配置mysql数据库 1&#xff09;在项目同名包下的_init_.py里面添加…...

python cartopy手动导入地图数据绘制底图/python地图上绘制散点图:Downloading:warnings/散点图添加图里标签

……开学回所&#xff0c;打开电脑spyder一看一脸懵逼&#xff0c;简直不敢相信这些都是我自己用过的代码&#xff0c;想把以前的自己喊过来科研了&#xff08;&#xff09; 废话少说&#xff0c;最近写小综述论文&#xff0c;需要绘制一个地图底图&#xff0b;散点图&#xff…...

JavaScript中常用的数组方法

在日常开发中&#xff0c;我们会接触到js中数组的一些方法&#xff0c;这些方法对我们来说&#xff0c;可以很便利的达到我们想要的结果&#xff0c;但是因为方法比较多&#xff0c;有些方法也不常用&#xff0c;可能会过一段时间就会忘记&#xff0c;那么在这里我整理了一些数…...

磁疗为什么“没效果”?原来真相是这样!

很多人磁疗之后&#xff0c; 总爱迫不及待问一个问题&#xff1a; “这个多长时间见效啊&#xff1f;” …… 还有些人几天没有效果&#xff0c; 就果断下结论&#xff1a; “这东西没用&#xff01;” …… 有不少人错误地把磁疗等同于“药品”一样看待&#xff0c;总觉得…...

【直击招聘C++】5.1函数模板

5.1函数模板一、要点归纳1.定义函数模板2.实例化函数模板3.重载模板函数4.函数调用的匹配顺序一、要点归纳 1.定义函数模板 定义函数模板的一般格式如下&#xff1a; template<类型形参表> 返回类型 函数名&#xff08;形参表&#xff09; {函数体&#xff1b; }例如以…...

谈谈Java多线程离不开的AQS

如果你想深入研究Java并发的话&#xff0c;那么AQS一定是绕不开的一块知识点&#xff0c;Java并发包很多的同步工具类底层都是基于AQS来实现的&#xff0c;比如我们工作中经常用的Lock工具ReentrantLock、栅栏CountDownLatch、信号量Semaphore等&#xff0c;而且关于AQS的知识点…...

国际化语言,多语言三种方式

可以用透传的方式&#xff0c;自己写local的json文件&#xff0c;不需要配置什么&#xff0c;直接传&#xff0c;自己写方法i18n nextjsi18n umi4一、透传的方式 export const AppContext React.createContext<any>({})app.tsx 用context包裹import type { AppProps } f…...

C++——哈希3|位图

目录 常见哈希函数 位图 位图扩展题 位图的应用 常见哈希函数 1. 直接定址法--(常用) 这种方法不存在哈希冲突 取关键字的某个线性函数为散列地址&#xff1a;Hash&#xff08;Key&#xff09; A*Key B 优点&#xff1a;简单、均匀 缺点&#xff1a;需要事先知道关键字的…...

75 error

全部 答对 答错 选择题 3. 某公司非常倚重预测型方法交付项目&#xff0c;而其招聘的新项目经理却习惯于运用混合型方法。项目范围包含很多不清晰的需求。项目经理应该如何规划项目的交付&#xff1f; A company that is heavily focused on delivering projects using predi…...

ESP-C3入门8. 连接WiFi并打印信息

ESP-C3入门8. 连接WiFi并打印信息一、ESP32 连接WiFi的基本操作流程1. 初始化nvs存储2. 配置WiFi工作模式3. 设置WiFi登陆信息4. 启动WiFi5. 开启连接6. 判断是否成功二、事件处理函数1. 定义事件处理函数2. 创建事件组3. 在事件处理函数中设置事件组位4. 在其他任务中等待事件…...

使用python将EXCEL表格中数据转存到数据库

使用Python将excel表格中数据转存到数据库 1. 思路&#xff1a; 1&#xff09; 使用python读取excel表格中数据 2&#xff09;根据数据生成sql语句 3&#xff09;批量运行sql语句 2. 代码&#xff1a; import pandas as pddef readExcel(path, excel_file):return pd.read_e…...

告别命令行!用C#和FFMpegCore给你的视频批量加水印和转码

用C#和FFMpegCore打造企业级视频处理流水线 每次看到团队里的小伙伴手动用FFmpeg命令行处理上百个视频文件时&#xff0c;我都忍不住想——这简直是在浪费生命。作为经历过这种痛苦的技术负责人&#xff0c;我深知自动化视频处理对于内容团队的重要性。今天&#xff0c;我将分享…...

老旧电脑焕新生:OpenClaw+Qwen3-4B低资源占用优化方案

老旧电脑焕新生&#xff1a;OpenClawQwen3-4B低资源占用优化方案 1. 为什么需要低资源优化方案 去年我翻出一台2015款的MacBook Air&#xff0c;4GB内存的配置在当下连开几个Chrome标签页都吃力。但作为技术爱好者&#xff0c;我总想让它发挥余热。当我尝试在这台设备上运行O…...

文章标题:专业ASIC FPGA IP加密代码解密工具

专业 ASIC FPGA IP 加密代码解密工具 支持 Xilinx Vivado IP 解密&#xff0c;包括 ip、vp、iip、vip、dw、rtl、run 包等&#xff1b;还支持解密 Verilog、VHDL、SystemVerilog&#xff08;sv、svp、svh、svi&#xff09;等多种语言&#xff0c;能够解密所有加密文件 解密工具…...

字节跳动开源Coze后,个人开发者如何快速上手?保姆级教程来了

字节跳动开源Coze实战指南&#xff1a;从零构建AI智能体的完整路径 当字节跳动宣布将Coze平台全面开源时&#xff0c;整个开发者社区为之振奋。这个被称作"AI智能体全栈工厂"的平台&#xff0c;如今终于揭开了神秘面纱&#xff0c;让个人开发者能够深入探索其技术内核…...

光学工程师进阶指南:从入门到精通的实战路径

1. 光学工程师的职业发展路径 光学工程师的成长就像搭积木&#xff0c;需要从最基础的模块开始&#xff0c;一层层往上搭建。我刚入行时也走过不少弯路&#xff0c;后来才明白这个职业的发展是有明确路径的。一般来说&#xff0c;我们可以把成长过程分为三个阶段&#xff1a;初…...

银河麒麟kylin.desktop-generic编译程序执行权限问题深度解析与实战解决方案

1. 银河麒麟权限问题的现象与本质 最近在银河麒麟kylin.desktop-generic环境下开发时&#xff0c;遇到了一个让人头疼的问题&#xff1a;明明用gcc编译生成的可执行文件已经显示有x权限&#xff0c;运行时却提示"权限不够"。这种看似矛盾的报错&#xff0c;其实是银河…...

5种突破方案:非Steam游戏创意工坊模组获取终极指南

5种突破方案&#xff1a;非Steam游戏创意工坊模组获取终极指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 一、问题定位&#xff1a;非Steam玩家的创意工坊访问困境 1.1 核…...

一站式高效图像矢量化解决方案:从位图到无限缩放的矢量转换

一站式高效图像矢量化解决方案&#xff1a;从位图到无限缩放的矢量转换 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer 图像矢量化是现代数字…...

微信自动化终极方案:5分钟打造你的Python智能助手

微信自动化终极方案&#xff1a;5分钟打造你的Python智能助手 【免费下载链接】WechatBot 项目地址: https://gitcode.com/gh_mirrors/wechatb/WechatBot 还在为重复的微信消息回复而烦恼吗&#xff1f;每天处理大量群消息、客户咨询和通知发送&#xff0c;占用了你宝贵…...

颠覆式采集:3步解锁百万级数据价值——TikTokCommentScraper开源方案全解析

颠覆式采集&#xff1a;3步解锁百万级数据价值——TikTokCommentScraper开源方案全解析 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 在数字营销与用户研究领域&#xff0c;数据采集效率直接决定决策速度…...