传输大型图像数据集的快速方法PYTHON 3

时间:2017-11-30 13:23:12

标签: python sockets bytebuffer bytestring

首先感谢您的时间。我需要将图像从一台PC(Windows)传输到另一台PC(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 个答案:

没有答案