Socket通信でサーバ(Python)からクライアント(Python)に画像を転送してOpenCVで扱う

サーバ側

import socketserver
import cv2
import numpy
import socket
import sys
import random

class TCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        frame = cv2.imread("test.png")
        pngstring = cv2.imencode(".png", frame)[1].tobytes()
        self.request.send(pngstring)

HOST = 'localhost'
PORT = 12345

socketserver.TCPServer.allow_reuse_address = True
server = socketserver.TCPServer((HOST, PORT), TCPHandler)

try:
    server.serve_forever()
except KeyboardInterrupt:
    pass
server.shutdown()
sys.exit()

クライアント側

import socket
import numpy
import cv2

HOST = 'localhost'
PORT = 12345

def get_image():
    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((HOST, PORT))

    sock.send(('a').encode("utf-8"))

    buf = b''
    rxlen = 100
    while rxlen > 0:
        rxstr = sock.recv(1024)
        rxlen = len(rxstr)
        buf += rxstr

    sock.close()

    narray = numpy.frombuffer(buf, dtype = 'uint8')
    return cv2.imdecode(narray, 1)

while True:
    im = get_image()
    cv2.imshow('Capture', im)
    if cv2.waitKey(500) & 0xFF == ord('q'):
        break

get_image()