首页 > 系统相关 >在一个进程中通过队列的方式缓存opencv视频帧,并在另一个进程中读取

在一个进程中通过队列的方式缓存opencv视频帧,并在另一个进程中读取

时间:2023-05-08 11:34:07浏览次数:38  
标签:q1 __ 缓存 frame cv2 opencv q2 进程 open

import _thread
import queue
import time

import cv2
from flask import Flask, Response

app = Flask(__name__)

max_size = 3
q1 = queue.Queue(maxsize=max_size)
q2 = queue.Queue(maxsize=max_size)

open_flag = 1


def open_and_show(ip_camera_url, title):
    global open_flag

    cap = cv2.VideoCapture(ip_camera_url)

    while open_flag == 1:
        ret, frame = cap.read()  # 读取视频帧
        if title == "1":
            if q1.full():
                q1.get()
            q1.put(frame)
        elif title == "2":
            if q2.full():
                q2.get()
            q2.put(frame)

    cap.release()


def gen_frames():
    # 在主函数中加入死循环,以防止程序退出

    fourcc = cv2.VideoWriter_fourcc(*"mp4v")
    out = cv2.VideoWriter(f'{int(time.time())}.mp4', fourcc, 20, (1080*2, 720))

    while True:
	#if q1.empty() or q2.empty() or q3.empty() or q4.empty():
        if q1.empty() or q2.empty():
            continue
        # 调整每个摄像头的分辨率和大小,使它们适合融合
        frame1 = q1.get()
        frame2 = q2.get()

        # 调整每个摄像头的分辨率和大小,使它们适合融合
        frame1 = cv2.resize(frame1, (1080, 720))
        frame2 = cv2.resize(frame2, (1080, 720))

        # print(frame1.shape, frame2.shape, frame3.shape,)
        # 在水平方向将三个帧连接起来

        frames = [frame1, frame2]
        combined_frame = cv2.hconcat(frames)

        out.write(combined_frame)

        # 显示融合的帧
        # cv2.imshow("Combined Frames", combined_frame)

        ret, buffer = cv2.imencode('.jpg', combined_frame)
        frame = buffer.tobytes()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

        # 按下 'q' 键退出循环
        if cv2.waitKey(1) == ord('q'):
            break


@app.route("/")
def index():
    global open_flag

    open_flag = 0
    time.sleep(1)
    open_flag = 1
    try:
        _thread.start_new_thread(open_and_show, ("rtsp://admin:[email protected]:554", "1",))
        _thread.start_new_thread(open_and_show, ("rtsp://admin:[email protected]:554", "2",))

    except:
        print("Error: 无法启动线程")

    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == "__main__":
    app.run(
        port=5000,
        host="0.0.0.0"
    )

标签:q1,__,缓存,frame,cv2,opencv,q2,进程,open
From: https://www.cnblogs.com/bitterteaer/p/17381233.html

相关文章

  • Hibernate4之二级缓存配置
    缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache。缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快。 缓存的范围分为3类: 1.事务范围(单Session即一级缓存)   事务范围......
  • Mybatis缓存机制
    1.ORM映射:将数据库中的一条语句映射到Java对象。2.MyBatis缓存机制:执行查询语句时候,将查询结果放到缓存当中(内存),如果下一次还是执行完全相同的查询语句,直接从缓存中拿数据。不再查数据库。不再去硬盘上找数据。目的是为了提高效率,通过减少IO的方式提高效率。3.缓存指针对查询语......
  • laravel-permission 缓存导致的Redis带宽占用问题
     先决条件spatie/laravel-permission:3.18.0权限数:634角色数:94问题laravel-permission的缓存机制设计的不太合理将所有的权限存放在一个大set中,且存放了许多不必要的信息。当项目拥有大量的角色权限,使得这个set达到了11mb,非常影响性能。解决方案spatie/laravel......
  • 基于opencv的OCR识别
    前言最近项目需要识别图片中的文字,实现之后把流程记录一下,希望对你有所帮助。运行环境win10,python3.8,opencv-python==4.7.0.68,pytesseract(需另外下载安装,请根据自己环境自行选择版本,dev表示正式版,beta测试版,w32位,W64位)引用上述安装好的pytesseract#指定配合opencv图片文......
  • hibernate二级缓存(包括注解方式)
    二级缓存配置(spring+hibernate)说明:本人不建议使用查询缓存,因为查询缓存要求完全相同的查询sql语句才会起作用,所说的查询缓存是针对第二次查询时sql语句与第一次sql语句完全相同那么就可以从缓存中取数据而不去数据库中取数据了,在不启用查询缓存的情况下......
  • 《asyncio 系列》6. 在 asyncio 中引入多进程
    楔子到目前为止我们使用asyncio获得的性能提升,一直专注在并发运行IO密集型工作上面,当然运行IO密集型工作是asyncio的主要工作,并且按照目前编写代码的方式,需要注意不要在协程中运行任何的CPU密集型代码。但这似乎严重限制了asyncio的使用,因为这个库能做的事情不仅仅限......
  • Linux 系统进程守护工具 cesi + superviosr
    一、安装Supervisorpipinstallsupervisor使用echo_supervisord_conf命令生成默认配置文件echo_supervisord_conf>/etc/supervisord.conf配置文件说明位置:etc/supervisord.conf内容:#指定了socketfile的位置[unix_http_server]file=/tmp/supervisor.sock;UNIXsock......
  • C# 在管理员权限的进程里降权启动一个权限为普通权限的进程
    在管理员权限的进程里降权启动一个权限为普通权限的进程,在根据网上的说法尝试了很多方式,要么不成功降权,要么需要账户名+密码。最终在 https://blog.csdn.net/WPwalter/article/details/88384279#_explorerexe__50博客中找到一个比较简单的方式。varsubProcessFileName="C:......
  • opencv 轮廓检测
    轮廓检测目录轮廓检测cv2.findContours特征矩cv2.drawContours轮廓特征计算轮廓面积计算轮廓周长轮廓检测的作用可以检测图图像或者视频中物体的轮廓计算多边形边界,形状逼近和计算感兴趣区域为了更精确地提取轮廓,请使用二值图。也就是说,在使用轮廓提取函数前,请将源图片运......
  • vmmap查看进程虚拟内存和x64dbg是一样的
     示例了一个进程,如下是x64dbg看到的:  在vmmap里看到的,可以知道是完全一样的:  ......