Python使用socket无损连续传输ndArray图片
工程目的:让C++工程调用其他机器里的python深度学习算法
目前成果:测试完成了本机python之间使用socket连续传输无损array格式图片,本机发送几乎无延迟,局域网发送取决于路由器带宽
测试结果
客户端 发送图片数据
将cv2.VideoCapture改成你使用的图片读取方式即可
IP和端口改成和服务器一致,服务器ip就是主机的局域网ip
import socket
import time
import cv2
import numpy as np
# 创建socket
tcp_client_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
# 目的信息 服务器IP
server_ip = "192.168.1.113"
server_port = 8088
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 海康网络监控相机读取视频流 1280*720 RGB uint8
capture = cv2.VideoCapture('rtsp://用户名:密码@相机IP/Streaming/Channels/101')
cv2.namedWindow('camera',cv2.WINDOW_NORMAL)
while capture.isOpened() :
success, frame = capture.read()
# 视频结束
if not success :
print('Video Reading Finished!')
break
# 按q结束
if cv2.waitKey(1) & 0xff == ord('q') :
# 释放所有资源
cv2.destroyAllWindows()
capture.release()
tcp_client_socket.close()
print('Video Reading & TCP Sending Stopped!')
break
# 视频流显示
cv2.imshow('camera',frame)
cv2.waitKey(1)
# 图片发送
tcp_client_socket.send( frame.tobytes() )
# 等待回传信息,接收到才能进行下一次发送,具有同步功能
recv_data = tcp_client_socket.recv(1024)
# print('接收到回传信息:', recv_data.decode('gbk'))
服务端 接收图片数据
client_socket.recv(3000000)只需要改的比你的图片单张字节数更大即可
recv_data_whole.len() == 2764800 这里改成你的单张图片字节数,我使用的是720pRGB uint8,即2764800 = 1280* 720* 3
reshape([720,1280,3]) 这里改成你的图片的高,宽,通道数
import socket
import time
import cv2
import numpy as np
# 创建socket
tcp_server_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
# 本地信息 本机IP
address = ('192.168.1.113', 8088)
# 绑定
tcp_server_socket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
# listen里的数字表征同一时刻能连接客户端的程度.
tcp_server_socket.listen(128)
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
# clientAddr 是元组(ip,端口)
client_socket, clientAddr = tcp_server_socket.accept()
recv_data_whole = bytes()
while 1:
# 接收对方发送过来的数据,和udp不同返回的只有数据
recv_data = client_socket.recv(3000000) # 接收n个字节
if len(recv_data) == 0 :
# 关闭socket
client_socket.close()
tcp_server_socket.close()
print('客户端已断开连接,服务结束')
break
# client_socket, clientAddr = tcp_server_socket.accept() # 也可以等待重连
else:
recv_data_whole += recv_data
# print('接收到的数据长度为:', recv_data_whole.__len__())
if recv_data_whole.__len__() == 2764800 : # 720p RGB单张图像大小
# 字节数据转回图片
frame = np.frombuffer(recv_data_whole, dtype=np.uint8).reshape([720,1280,3])
recv_data_whole = bytes()
cv2.imshow('camera_recevied',frame)
cv2.waitKey(1)
# 回传信息,很重要,具有同步功能
client_socket.send("image has been received!".encode('gbk'))