Python使用socket无损连续传输ndArray图片,简单快速的方案

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'))