Python 如何接收二进制数据并对其进行处理而不将其保存为文件格式?

Python 如何接收二进制数据并对其进行处理而不将其保存为文件格式?,python,image,performance,sockets,opencv,Python,Image,Performance,Sockets,Opencv,我最终成功地编写了代码,从我的客户机接收图像数据,处理数据,并将结果发送回客户机。 它只有少数客户端没有问题,但实际上它效率很低,因此无法处理许多客户端,因为它不直接处理数据。它将数据保存到图像文件中,然后加载并处理它 如何跳过保存过程并直接处理它 import socket serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverSock.bind(("", someport_no)) se

我最终成功地编写了代码,从我的客户机接收图像数据,处理数据,并将结果发送回客户机。 它只有少数客户端没有问题,但实际上它效率很低,因此无法处理许多客户端,因为它不直接处理数据。它将数据保存到图像文件中,然后加载并处理它

如何跳过保存过程并直接处理它


import socket
serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSock.bind(("", someport_no))
serverSock.listen(3)




def detects():
    net = cv2.dnn.readNet(dir + "yolov3_training_5000.weights", dir + "config_multiple.cfg")

    layer_names = net.getLayerNames()
    output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

    arr1 = np.empty((0,2), int)

    img = cv2.imread(dir + "Rune_client.png")
    # img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2HSV) # hsv
    # img = cv2.inRange(img, lower, upper) # mask
   
    # kernel = np.ones((3, 3), np.uint8)
    # img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # morp open
    
    # kernel = np.ones((10, 10), np.uint8)
    # img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) # morp close
    
    # img = cv2.cvtColor(np.array(img), cv2.COLOR_GRAY2BGR) # convert 1 channel to 3 channels


    height, width, channels = img.shape
    blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    net.setInput(blob)
    outs = net.forward(output_layers)
    # Showing informations on the screen
    class_ids = []
    confidences = []
    boxes = []
    store = 0
    count = 0
    first = 1
    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.9:
                # Object detected
                # print(class_id,detection[0],confidence)
                # center_x = int(detection[0] * width)
                layover = 0
                for ele in arr1:
                    if float(ele[0]) - 0.03 <= detection[0] and detection[0] <= float(ele[0]) + 0.03 :
                        layover = 1
                if layover == 0 or first:
                    # print('first ',first)
                    # print('layover',layover)
                    first = 0
                    if class_id == 0:
                        print('up',detection[0],confidence)
                    elif class_id == 1:
                        print('down',detection[0],confidence)
                    elif class_id == 2:
                        print('left',detection[0],confidence)
                    elif class_id == 3:
                        print('right',detection[0],confidence)
                    count += 1
                    arr1 = np.append(arr1, np.array([[detection[0], str(class_id)]]), axis=0)
                    # print('arr1 : \n',arr1)
                # arr2 = np.array([[detection[0],class_id]])
                # arr3 = np.append(arr1, arr2, axis = 0)
                # arr1 = arr3
                    
    arr_sorted = arr1[np.argsort(arr1[:, 0])]
    print("Number of arrows : " + str(arr_sorted.shape[0]))
    print(arr_sorted)
    if arr_sorted.shape[0] == 4:
        return str(arr_sorted[0][1]+arr_sorted[1][1]+arr_sorted[2][1]+arr_sorted[3][1])
    else:
        return '0' # function detects



count = 0
while 1:
    print("Waiting for connection ...")
    client, addr = serverSock.accept()
    print("Connection established")

    recvData = client.recv(16) #Receives file size
    fileSize = int().from_bytes(recvData, "little") #Decoding file size
    print("The file size : ", fileSize)
    totalRecv = bytes() #Convert totalRecv variable's data type to bytes object
    recvCount = bytes()
    while True:
        recvData = client.recv(1024)# Puts the data received from the client 1024kb each.
        totalRecv += recvData # Stacks received data into totalRecv
        if len(totalRecv) == fileSize:#Ends receiving when the size matches.
            break
    with open(dir + "rune_client.png", "wb") as f:
        f.write(totalRecv)
    # client, addr = serverSock.accept()
    print("Image analizing...")
    first = time.perf_counter()
    result = detects() # processes the image
    client.send(result.encode("utf-8"))
    second = time.perf_counter()
    print('Detect time : ',second - first)
    count += 1
    print('Server access count : ', count)






导入套接字
serverSock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
serverSock.bind((“”,someport_no))
serverSock.listen(3)
def检测():
net=cv2.dnn.readNet(dir+“yolov3\u training\u 5000.weights”,dir+“config\u multiple.cfg”)
layer_names=net.getLayerNames()
output_layers=[layer_names[i[0]-1]表示网络中的i.getUnconnectedOutLayers()]
arr1=np.empty((0,2),int)
img=cv2.imread(dir+“Rune\u client.png”)
#img=cv2.cvtColor(np.array(img),cv2.COLOR_BGR2HSV)#hsv
#img=cv2.范围内(img,下部,上部)#遮罩
#内核=np.ones((3,3),np.uint8)
#img=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#morp OPEN
#内核=np.ones((10,10),np.uint8)
#img=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#morp CLOSE
#img=cv2.CVT颜色(np.array(img),cv2.COLOR_GRAY2BGR)#将1个通道转换为3个通道
高度、宽度、通道=img.shape
blob=cv2.dnn.blobFromImage(img,0.00392,(416416),(0,0,0),True,crop=False)
net.setInput(blob)
outs=净正向(输出层)
#在屏幕上显示信息
类_id=[]
信任=[]
框=[]
存储=0
计数=0
第一个=1
对于out-in-out:
对于检测输入输出:
分数=检测[5:]
class_id=np.argmax(分数)
信心=分数[班级id]
如果置信度>0.9:
#检测到的对象
#打印(类别id,检测[0],置信度)
#中心x=int(检测[0]*宽度)
中途停留=0
对于arr1中的ele:
如果浮动(ele[0])-0.03