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