Sending live video frame over network in python opencv

后端 未结 7 1672
南旧
南旧 2020-11-28 06:39

I\'m trying to send live video frame that I catch with my camera to a server and process them. I\'m usig opencv for image processing and python for the language. Here is my

7条回答
  •  野性不改
    2020-11-28 07:00

    I changed the code from @mguijarr to work with Python 3. Changes made to the code:

    • data is now a byte literal instead of a string literal
    • Changed "H" to "L" to send larger frame sizes. Based on the documentation, we can now send frames of size 2^32 instead of just 2^16.

    Server.py

    import pickle
    import socket
    import struct
    
    import cv2
    
    HOST = ''
    PORT = 8089
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print('Socket created')
    
    s.bind((HOST, PORT))
    print('Socket bind complete')
    s.listen(10)
    print('Socket now listening')
    
    conn, addr = s.accept()
    
    data = b'' ### CHANGED
    payload_size = struct.calcsize("L") ### CHANGED
    
    while True:
    
        # Retrieve message size
        while len(data) < payload_size:
            data += conn.recv(4096)
    
        packed_msg_size = data[:payload_size]
        data = data[payload_size:]
        msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
    
        # Retrieve all data based on message size
        while len(data) < msg_size:
            data += conn.recv(4096)
    
        frame_data = data[:msg_size]
        data = data[msg_size:]
    
        # Extract frame
        frame = pickle.loads(frame_data)
    
        # Display
        cv2.imshow('frame', frame)
        cv2.waitKey(1)
    

    Client.py

    import cv2
    import numpy as np
    import socket
    import sys
    import pickle
    import struct
    
    cap=cv2.VideoCapture(0)
    clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    clientsocket.connect(('localhost',8089))
    
    while True:
        ret,frame=cap.read()
        # Serialize frame
        data = pickle.dumps(frame)
    
        # Send message length first
        message_size = struct.pack("L", len(data)) ### CHANGED
    
        # Then data
        clientsocket.sendall(message_size + data)
    

提交回复
热议问题