Быстрый способ передачи больших наборов данных изображений PYTHON 3

Прежде всего спасибо за ваше время. Мне нужно перенести образы с одного ПК (Windows) на другой (Linux) и наоборот. Я использовал сокеты и потоки байтов. Как бы то ни было, для отправки одного изображения требуется 4 секунды, что является безумным количеством времени. Я что-то упускаю здесь? Есть ли библиотека, которая поддерживает быструю передачу файлов как в Windows, так и в Linux?

Сервер или отправитель

import numpy 
import socket
import threading
import os
from idlelib.IOBinding import encoding
import Communication
import multiprocessing
import time
import cv2
import WrapDatastructures
import sys
import ImageProcessorClient

Queue = multiprocessing.Queue()

def SendFileToClient(name, sock, image, image_number):
    #ImageRequest
    ImageRequest = sock.recv(1024)

    #Decode the Bytestring into ascii characters
    ImageRequestAsStr = ImageRequest.decode('ascii')
    print("Incoming Request String:",ImageRequestAsStr)

    if ImageRequestAsStr == "FILEFLAG":
        #Cascade to convert grayscale image to byte array and send it to Image Processor Client
        gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

        #Send size of the image to processor client
        memoryConsumption = sys.getsizeof(gray_image)
        print("Memory Consumtion",memoryConsumption)

        sendStr = "EXISTS" + str(memoryConsumption)

        #Convert the string to byte because otherwise it will not be send
        sock.send((sendStr.encode(encoding)))
        userResponse = sock.recv(1024)

        #the Responce will be received in byte and will be converted to a string to make it checkable
        userResponceStr = userResponse.decode('ascii')

        if userResponceStr[:2] == 'OK':
            #Get byte array
            print("Convert grayscale_image to bytedata")
            data = WrapDatastructures.singleChannelImgToByte(gray_image)
            #bytesToSend = data #send 1024 bytes
            #sock.send(bytesToSend)
            sendData = 0
            for i in range(0,memoryConsumption,1024):
                sock.send(data[i:i+1024])
        else:
            print("User response not known")
    else:
        sendStr = "ERR"
        sock.send(sendStr.encode(encoding))

    sock.close()

def Main():
    host = "127.0.0.1"
    port = 5000

    s = socket.socket()
    s.bind((host,port))
    s.listen(5)

    #init camera

    print("server started.")

    imageCounterPerContainer = 0
    while(True):
        #Take image and put it in Q

        #Call the controller to turn motor

        #look for client to get request
        if Queue.empty() is True:
            #create client
            print("create Client")

        while True:
            c, addr = s.accept()
            print("client connected ip:< " + str(addr) +">")
            imageCounterPerContainer +=1
            t = threading.Thread(target = SendFileToClient, args=("rtrThread",c,cv2.imread("image_33.jpg"),imageCounterPerContainer))
            t.start()
        s.close()
if __name__ == "__main__":
    Main()

процессор

import socket
from idlelib.IOBinding import encoding
import WrapDatastructures
import cv2
import time
def Main():
    host = "127.0.0.1"
    port = 5000
    start = time.time()
    s = socket.socket()
    s.connect((host,port))

    getfileRequest = "FILEFLAG" 

    if getfileRequest != "q":
        s.send(getfileRequest.encode())
        data = s.recv(1024)
        dataStr = data.decode('ascii')
        if dataStr[:6] == "EXISTS":
            filesize = int(dataStr[6:])
            print("Data is available size", filesize)
            sendStr = "OK"
            s.send(sendStr.encode(encoding))
            #create new file new_filename and 
            img = b""
            while True:
                data = s.recv(1024)
                if len(data) == 0:
                    break
                img = b"".join([img, data])
            print("Download Complete")
            transferedImg = WrapDatastructures.ByteToCV2(img, (2048,2448))
            cv2.imshow("transfered",transferedImg)
            end = time.time()
            print("Duration",end -start)
            cv2.waitKey(0)
            s.close()
        else:
            print("File does not exists")#
            s.close()        
    s.close()
if __name__ == "__main__":
    Main()

0 ответов

Другие вопросы по тегам