首页 > 编程语言 >python 利用imagezmq实现图片传输

python 利用imagezmq实现图片传输

时间:2023-08-18 15:22:25浏览次数:48  
标签:imagezmq python image cv2 传输 simplejpeg time import

1. 需求背景

由于项目需求,需要在一个网页显示9个摄像头过算法的实时画面,项目初期,拟用ffmpeg实现二次推流过算法,后期由于ffmpeg仅能用于命令行命令,而且不易实现音频同步,故而使用ffmpeg进阶版pyav实现,后因pyav太占用服务器CPU性能,升级为将视频流的每一帧转为图片存入redis,前端实时从redis获取,后因redis效果不好,太卡,模糊(卡与模糊的原因是redis与后端不在同一个服务器上,导致两次图片传输走无线网,从而卡顿,都放在一台服务器器就好了,目前正在用django自带的内存取代redis实现),进而考虑通过imagezmq消息队列实现

2. 实现代码

准备工作

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple imagezmq
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple simplejpeg
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple picamera
# 理论上最后一个没用到,这个是官网方法用的

发送端

import socket
import time
import cv2
import imagezmq
import traceback
import simplejpeg

# capture=cv2.VideoCapture(0) # 获取摄像头视频
# capture = cv2.VideoCapture(r"E:\桌面\新建文件夹\test.mp4")
capture = cv2.VideoCapture("rtsp://192.168.110.219:8554/live")
# 192.168.100.104 为发送端主机ip地址
sender = imagezmq.ImageSender(connect_to='tcp://192.168.110.239:5555', REQ_REP=False)
rpi_name = socket.gethostname()  # 获取主机名
time.sleep(2.0)
jpeg_quality = 95  # 调整图片压缩质量,95%
while (True):
    try:
        ref, frame = capture.read(0)
        time.sleep(1 / 60)
        image = cv2.resize(frame, (1280, 720))
        curtime = time.time()
        msg = rpi_name + '*' + str(curtime)
        # 通过simplejpeg函数将图片编码为jpeg格式,提高传输效率
        jpg_buffer = simplejpeg.encode_jpeg(image, quality=jpeg_quality,
                                            colorspace='BGR')
        sender.send_jpg(msg, jpg_buffer)
        # cv2.imshow(rpi_name, image)
        cv2.waitKey(1)
    except:
        print(traceback.print_exc())
        break

接收端

这部分理论上应由前端实现,但是前端不好找方法,后端就先写了个接口

import cv2
import imagezmq
import traceback
import time
import simplejpeg

# 接收发送端数据,输入发送端的ip地址
image_hub = imagezmq.ImageHub(open_port='tcp://192.168.110.239:5555', REQ_REP=False)
frame_count = 1
time1 = 0
while True:
    try:
        time1 = time.time() if frame_count == 1 else time1
        name, image = image_hub.recv_jpg()
        # 解码
        image = simplejpeg.decode_jpeg(image, colorspace='BGR')
        cv2.imshow(name.split('*')[0], image)
        cv2.waitKey(1)
        time2 = time.time()
        print(image.shape[:2], int(frame_count / (time2 - time1)))
        frame_count += 1
    except:
        print(traceback.format_exc())
        break

参考:https://blog.csdn.net/hanshuobest/article/details/105131157
imageZMQ官网

标签:imagezmq,python,image,cv2,传输,simplejpeg,time,import
From: https://www.cnblogs.com/beijie/p/17640617.html

相关文章

  • 使用 OpenCV Python 检测和可视化两个图像之间的差异
    使用OpenCVPython检测和可视化两个图像之间的差异转自:使用OpenCVPython检测和可视化两个图像之间的差异-Glasshost如果您需要比较两个图像并确定它们之间的差异,OpenCVPython提供了一种简单有效的方法来完成此任务。本指南将向您展示如何使用OpenCVPython检测和可视......
  • 必备Python代码段
    1.反转字符串以下代码使用Python切片操作来反转字符串。#Reversingastringusingslicingmy_string="ABCDE"reversed_string=my_string[::-1]print(reversed_string)#Output#EDCBA2.使用标题类(首字母大写)以下代码可用于将字符串转换为标题类。这是通过使用字符串类中......
  • python使用netmiko连接交换机绑定mac
    环境背景python3.8,华为交换机每次手动登录交换机再进行绑定操作,太过机械化啊,本着懒人原则,写一个脚本真不是事情脚本fromnetmikoimportConnectHandlerimporttimedefbing_mac(mac):sw_ip='10.10.10.10'#交换机ipusername='admin'#交换机账号......
  • Python打包时的MANIFEST.in如何使用
    MANIFEST.in文件用于控制在Python包的源码分发中应该包含哪些文件和目录。这对于包含在源码分发中但不是Python源代码文件的文件(如文档、配置文件、数据文件等)特别有用。以下是MANIFEST.in中的主要指令及其描述:include:包含匹配指定模式的文件。includeexample.txt......
  • (一)Qt与Python—PySide的简介及安装
    目录1.Pyside的简介2.pyside的安装3.pyside的Helloworld程序4.参考文献及网站连接1.Pyside的简介​PySide(在本文中指代PySide2和PySide6)是一个Python的图形化界面(GUI)库,由C++版的Qt开发而来,在用法上基本与C++版没有特别大的差异。PySide是一个python绑定的跨平台图形化......
  • python初阶语法
    python基础语法长文警告!!!本文适合初学py的小白阅读(根据需要进行跳转)。输出函数print()#输出数字print(98.5)#输出字符串print("Hello,clovershrub")print('hello,world')#输出表达式print(3+1)#将数据输出文件中,注意点,1.所指定的盘存在,2.使用file=fpfp=open('D:......
  • Python 矢量数据库和矢量索引:构建 LLM 应用程序
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景由于使用其硬件创建的生成式AI应用程序,Nvidia经历了显着的增长。另一项软件创新,矢量数据库,也正在乘着生成式人工智能的浪潮。开发人员正在向量数据库上用Python构建AI驱动的应用程序。通过将数据编码为向量,他们可以利......
  • Python字符串定义的三种方法!
    字符串是Python编程语言中的基本数据类型,也是Python编程中非常重要的数据类型之一。在Python中,我们可以通过三种不同的方式来定义字符串,分别是:单引号、双引号、三引号,接下来是具体的内容介绍。1、使用单引号在Python中,使用单引号来定义字符串是最基本的方式。单引号用......
  • bad_python
      对着正确的pyc文件在010把题目文件的前缀改掉  ......
  • Python如何下载wheel包
    安装wheelpipinstallwheel-ihttps://pypi.douban.com/simple下载pipwheel-ihttps://pypi.douban.com/simpleflask批量下载requirements.txtFlask==2.0.1Flask-Cors==3.0.10flask-restx==0.5.1SQLAlchemy==1.4.22pipwheel-rrequirements.txt......