Python 共享内存

该代码示例展示了如何通过ONVIF协议与摄像头交互,实现截图并利用共享内存进行图像处理。在`server.py`中,创建了一个ONVIFCamera类,初始化摄像头并定时获取快照,将图像数据写入共享内存。在`client.py`中,读取共享内存中的图像数据并显示。此实现涉及网络通信、图像处理和内存管理技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

清理文件,记录一下共享内存的代码。后面再解析理解。

server.py

import mmap
import contextlib
import time
import zeep
import numpy as np
import cv2
import time
from onvif import ONVIFCamera
import requests
from requests.auth import HTTPDigestAuth
with open("test.dat", "w") as f:
    f.write('\x00' * 1024)

def zeep_pythonvalue(self, xmlvalue):
    return xmlvalue
# with open('test.dat', 'r+') as f:
#     with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_WRITE)) as m:
#         for i in range(1, 10001):
#             m.seek(0)
#             s = ("msg " + str(i)).encode()
#             # s=s.rjust(1024, '\x00').encode()
#             print(s)
#             m.write(s)
#             m.flush()
#             time.sleep(1)



class onvifCamera(object):
    def __init__(self, ip: str, username: str, password: str):
        self.ip = ip
        self.username = username
        self.password = password
        zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
        self.init_ipc()
    def init_ipc(self):
        try:
            self.mycam = ONVIFCamera(self.ip, 80, self.username, self.password)
            self.media = self.mycam.create_media_service()  # 创建媒体服务
            self.media_profile = self.media.GetProfiles()[0]  # 获取配置信息
            # self.ptz = self.mycam.create_ptz_service()  # 创建控制台服务
            # print(self.media_profile)
            return True
        except Exception as e:
            print(e)
            return False

    def Snapshot(self):
        """
        截图
        :return:
        """
        res = self.media.GetSnapshotUri({'ProfileToken': self.media_profile.token})

        response = requests.get(res.Uri, auth=HTTPDigestAuth(self.username, self.password))
        print(len(response.content))
        return response.content
        # with open(self.save_path, 'wb') as f:  # 保存截图
        #     f.write(response.content)
camera0 = onvifCamera('192.168.8.153','admin','tensorsight666')
with open('test.dat', 'w+') as f:
    with contextlib.closing(mmap.mmap(f.fileno(), 1024*1024, access=mmap.ACCESS_WRITE)) as m:
            while True:
                m.seek(0)
                # s = ("msg " + str(i)).encode()
                image_buff = camera0.Snapshot()
                s=image_buff
                # s=s.rjust(1024, '\x00').encode()
                # print(s)
                image = cv2.imdecode(np.fromstring(s, np.uint8), 1)
                cv2.imshow('cv0', image)
                cv2.waitKey(1)
                m.write(s)
                m.flush()
                time.sleep(1)
# image_buff =camera0.Snapshot()

client.py

# -*- coding:utf-8 -*-
# SodrSnne's PYTHON
# @Time    : 2021/2/20 17:29
# @Email   : jisashandianmao@163.com
# @File    : client.py
# @Software: PyCharm
_author_ = 'SodrSnne'
import mmap
import contextlib
import time

import mmap
import contextlib
import time
import numpy as np
import cv2

while True:
    with open(r'E:\Business_projects\onvifs\ctrlcamrera\192.168.8.153\data.dat', 'r') as f:
        with contextlib.closing(mmap.mmap(f.fileno(), 1024*312, access=mmap.ACCESS_READ)) as m:
            s = m.read(1024*1000)#.replace('\x00', '')
            image = cv2.imdecode(np.frombuffer(s, np.uint8), 1)
            cv2.imshow('cv', image)
            cv2.waitKey(1)
            # print(s)
    time.sleep(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值