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

news2024/11/26 3:51:41

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

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

app.py

#!/usr/local/bin/python3
# encodin: utf-8

import subprocess
import threading
import time
import cv2
import os

from OpenVinoYoloV5Detector import OpenVinoYoloV5Detector
from OpenVinoSSDDetector import OpenVinoSSDDetector

class 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

    @staticmethod
    def get_even(num):
        if (num % 2) != 0:
            num = num + 1
        return num

    @staticmethod
    def 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)

        #ssd
        conf = {
            "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 rtscap

    def get_milsecond(self):
        t = time.time()
        return (int(round(t * 1000)))

    def isOK(self):
        status = self.isOpened() and self._reading
        return status

    def recv_frame(self):
        while self.isOK():
            time.sleep(0.01)
            ok, frame = self.read()
            if not ok:
                break
            self._cur_frame = frame
            #self.p.stdin.write(frame.tostring())
        self._reading = False

    def 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 = 3
        self.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_frame
        self._cur_frame = None
        return frame is not None, frame

    def 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.read

    def stop_read(self):
        self._reading = False
        if 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 0
    rtscap1.start_read()
    os.system('pause')

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

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

相关文章

遥感概念理解(更新中)

目录看一幅波长与光对应的图1、波段2、波段组合3、多波段数据的三种存储方式4、全色5、彩色6、 多光谱7、高光谱看一幅波长与光对应的图 1、波段 波段又称为波谱段或波谱带,在遥感技术中,通常把电磁波谱划分为大大小小的段落,大的成为波段区…

2023年数据安全的下一步是什么?

IT 预算和收入增长领域是每个年度开始时的首要考虑因素,在当前的世界经济状况下更是如此。 IT 部门和数据团队正在寻找确定优先级、维护和构建安全措施的最佳方法,同时又具有成本效益。 这是一个棘手的平衡点,但却是一个重要的平衡点&#…

java ssm自行车在线租赁系统idea

当前自行车在社会上广泛使用,但自行车的短距离仍旧不能完全满足广大用户的需求。自行车在线租赁系统可以为用户提供租赁用车等功能,拥有较好的用户体验.能实时在线租赁提供更加快捷方便的租车方式,解决了常见自行车在线租赁系统较为局限的自行车归还功能。 通过使用本系统&…

C语言学习笔记(九):文件的操作

C文件的知识 什么是文件 操作系统把各种设备都统一作为文件来处理。例如,终端键盘是输入文件,显示屏和打印机是输出文件。 文件一般指存储在外部介质上数据的集合。操作系统是以文件为单位对数据进行管理的 输入输出是数据传送的过程,数据…

【LeetCode】1124. 表现良好的最长时间段

1124. 表现良好的最长时间段 题目描述 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间…

多线程下载工具axel的安装和使用

多线程下载工具axel的安装和使用 Axel是一个轻量级下载程序,它和其他加速器一样,对同一个文件建立多个连接,每个连接下载单独的文件片段以更快地完成下载。 Axel 支持 HTTP、HTTPS、FTP 和 FTPS 协议。它也可以使用多个镜像站点下载单个文件…

Springboot 使用插件 自动生成Mock单元测试 Squaretest

缘起 很多公司对分支单测覆盖率会有一定的要求,比如 单测覆盖率要达到 60% 或者 80%才可以发布。 有时候工期相对紧张,就优先开发功能,测试功能,然后再去补单元测试。 但是编写单元测试又比较浪费时间,有没有能够很大…

Spirng 痛苦源码学习(四)——AOP老大哥

文章目录前言一、探究AOP开始,判断导入的相关组件1.跟踪源码流程二、对切面中的增强方法进行增强1.源码的过程三、使用aop的目标类生成代理对象总结前言 Spring的两大特性:IOC;AOP。本篇仅以跟完Spring AOP相关源码为依据写的总结 一、探究A…

MySQL入门篇-MySQL高级窗口函数简介

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL高级窗口函数 窗口函数在复杂查询以及数据仓库中应用得比较频繁 与sql打交道比较多的技术人员都需要掌握 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数据sql脚本 分析函数有3个基本组成…

matlab进行双目标定获取双目参数并打印教程

文章目录前言1.打开matlab进行双目标定2.获取想要的参数前言 在相同的标定算法和标定参数下,Python和Matlab的标定精度是相同的。因为标定精度主要取决于标定算法和标定参数的质量,而不是编程语言的选择。 不同的编程语言可能使用不同的库或实现细节&…

Hackergame 2020

3.Hackergame 2020 1.签到 url:http://202.38.93.111:10000/ 打开签到题页面,拖动滑杆,如果将滑杆滑动到最左边,提交 0,那么我们会得到成功的返回,但是没有 flag 尝试手动提交一些非整数的值&#xff0c…

HTML+CSS

HTML技术 什么是HTML Hyper Text Markup Language HTML:超文本标记语言,内部全部是一些不同的标记符号。 通俗的来讲:其实就是“网页”。 HTML 网页 网页的特点: 1、所有的网页都是通过【浏览器】来进行解析的。2、所有的网…

【MySQL】子查询

这里写自定义目录标题子查询1、子查询的基本使用2、 单行子查询2.1、单行比较查询2.2、HAVING 中的子查询2.3、CASE中的子查询3、多行子查询4、相关子查询5、EXISTS 与 NOT EXISTS关键字子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQ…

算法笔记(四)—— 排序算法总结及链表

排序算法稳定性 值相同的元素排序结束后能否保持相对秩序不变。 冒泡排序具有稳定性(相等时不交换)。 插入排序具有稳定性。 归并排序具有稳定性(merge的时候,相等时先拷贝左边的,小和问题让其丧失了稳定性&#x…

557. 反转字符串中的单词 III

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 方法一:使用额外空间 思路与算法 开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词&a…

Http中你必须知道那点事

1, HTTP 1.1 简介 HTTP概念 HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输。如果想知道具体的格式,可以打开浏览器&#xf…

2、线程、块和网格

目录一、线程、块、网格概念二、代码分析2.1 打印第一个线程块的第一线程2.2 打印当前线程块的当前线程2.3 获取当前是第几个线程一、线程、块、网格概念 CUDA的软件架构由网格(Grid)、线程块(Block)和线程(Thread&am…

Allegro如何设置导入Subdrawing可自由选择目录操作指导

Allegro如何设置导入Subdrawing可自由选择目录操作指导 用Allgro做PCB设计的时候,导入Subdrawing是非常常用的功能,在导入Subdrawing的时候,通常需要把Subdrawing文件放在需要导入PCB的相同目录下,不能自由选择,如下图 但是Allegro是支持自由选择目录的,只需按照下方的步…

Sphinx文档生成工具(一)

Sphinx在项目中部署应用 一、将安装的Sphinx发布 创建FindSphinx.cmake,这个名字只能是这个 find_program(SPHINX_EXECUTABLE NAMES sphinx-buildHINTS$ENV{SPHINX_DIR}HINTS ${SPHINX_ROOT}/binPATH_SUFFIXES binDOC "Sphinx documentation generator"…

企业为什么需要绩效管理软件?

随着经济的发展,企业的竞争日益激烈,“纸上谈兵”的绩效考核机制已经远远不能满足企业管理的需要。因此,企业绩效管理软件的重要性也日益凸显。 绩效管理软件可以提高企业管理效率、提高HR工作效率、提高员工工作能力。 今天就来给大家详细…