首页 > 解决方案 > 如何在python中将多维数组转换为字节和REVERSE?

问题描述

任务是通过客户端和服务器之间的套接字传输图像。服务器将图像转换为字节并通过套接字传输。客户端接收字节,但我找不到如何将它们转换回数组,我寻求帮助。

父类:

import threading
import socketserver


class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass


class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = self.request.recv(1024)
        self.server.queue.add(data)

class Queue:

    def __init__(self, ip, port):
        self.server = ThreadedTCPServer((ip, port), ThreadedTCPRequestHandler)
        self.server.queue = self
        self.server_thread = threading.Thread(target=self.server.serve_forever)
        self.server_thread.daemon = True

        self.messages = []

    def start_server(self):
        self.server_thread.start()
        print("Server loop running in thread:", self.server_thread.name)

    def stop_server(self):
        self.server.shutdown()
        self.server.server_close()

    def add(self, message):
        self.messages.append(message)

    def view(self):
        return self.messages

    def get(self):
        return self.messages.pop()

    def exists(self):
        return len(self.messages)

服务器父类:

import json

import socket
import time

from codex_queue import Queue

import cv2

class Server:

def __init__(self, ip, port):
    self.queue = Queue(ip, port)

def start_server(self):
    self.queue.start_server()

def stop_server(self):
    self.queue.stop_server()

def loop(self):
    Gaus_blur_kernel_size = 11

    cap = cv2.VideoCapture(0)
    ret, current_frame = cap.read()
    previous_frame = current_frame

    Gaus_kernel = (Gaus_blur_kernel_size, Gaus_blur_kernel_size)
    # while True:
    while(cap.isOpened()):
        current_frame_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)
        previous_frame_gray = cv2.cvtColor(previous_frame, cv2.COLOR_BGR2GRAY)

        current_frame_gray = cv2.GaussianBlur(current_frame_gray, Gaus_kernel, 0)
        previous_frame_gray = cv2.GaussianBlur(previous_frame_gray, Gaus_kernel, 0)


        frame_diff = cv2.absdiff(current_frame_gray,previous_frame_gray)

        self.send_img("localhost", 8889, frame_diff)#json.dumps(frame_diff))
        #cv2.imshow('frame diff ', frame_diff)
        if self.queue.exists():
            self.handle(self.queue.get())     
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        previous_frame = current_frame.copy()
        ret, current_frame = cap.read()

    cap.release()
    cv2.destroyAllWindows()


def send_img(self, ip, port, img):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    try:
        sock.sendall(bytes(img))
    finally:
        sock.close()

def handle(self, message):
    """
    Prototype
    """
    pass

客户端父类:

import socket
import time

from codex_queue import Queue


class Client:

    def __init__(self, ip, port):
        self.queue = Queue(ip, port)

    def start_client(self):
        self.queue.start_server()

    def stop_client(self):
        self.queue.stop_server()

    def loop(self):
        while True:
            #time.sleep(1)
            if self.queue.exists():
                self.handle(self.queue.get())

    def send(self, ip, port, message):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((ip, port))
        try:
            sock.sendall(bytes(message, 'ascii'))
        finally:
            sock.close()

    def handle(self, message):
        """
        Prototype
        """
        pass

服务器类:

import json
import requests
from server import Server

import cv2

class Server_computer(Server):

    def handle(self, message):
        try:
            print("Got  {}".format(message))
            url = json.loads(str(message, 'ascii'))["url"]
            response = requests.get(url)
        except Exception as e:
            print("Error: {}".format(e))
        else:
            result = {}
            result['status_code'] = response.status_code
            self.send("localhost", 8889, json.dumps(result))


if __name__ == "__main__":
    print("Server started.")

    getter = Server_computer("localhost", 8887)
    getter.start_server()
    getter.loop()
    getter.stop_server()

客户端类:

import cv2
from client import Client


class Client_listner(Client):
    
    def handle(self, img):
        try:
            print("Got image")
            int_values = [x for x in img]
            print(int_values)
            cv2.imshow('Getting image', int_values)      
        except Exception as e:
            print("Error: {}".format(e))


if __name__ == "__main__":
    print("Client started.")

    app = Client_listner("localhost", 8889)
    app.start_client()
    app.loop()
    app.stop_client()

标签: pythonarraysbyte

解决方案


推荐阅读