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'))
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python的套接字自动传输图片文件,你可以按照以下步骤进行操作: 1. 在发送端(客户端)将图片文件打开并读取为二进制数据。 2. 创建一个套接字并连接到接收端(服务器)的地址和端口。 3. 在发送端将图片数据通过套接字发送给接收端。 4. 在接收端接收数据并保存为图片文件。 以下是一个简单的示例代码,演示了如何使用socket套接字自动传输图片文件: **发送端(客户端)代码:** ```python import socket def send_image(image_path, host, port): # 打开并读取图片文件 with open(image_path, 'rb') as file: image_data = file.read() # 创建套接字并连接到服务器 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((host, port)) # 发送图片数据 client_socket.sendall(image_data) # 关闭套接字 client_socket.close() # 示例使用 image_path = 'image.jpg' # 图片文件路径 host = '服务器地址' port = 12345 # 服务器端口 send_image(image_path, host, port) ``` **接收端(服务器)代码:** ```python import socket def receive_image(save_path, host, port): # 创建套接字并绑定到指定地址和端口 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) # 监听连接 server_socket.listen(1) print(f"等待来自客户端的连接...") # 接受连接并接收图片数据 client_socket, address = server_socket.accept() print(f"连接来自:{address}") # 接收图片数据 image_data = client_socket.recv(1024) # 保存图片文件 with open(save_path, 'wb') as file: file.write(image_data) # 关闭套接字 client_socket.close() server_socket.close() print("图片接收完成!") # 示例使用 save_path = 'received_image.jpg' # 接收到的图片保存路径 host = '0.0.0.0' # 服务器地址(监听所有可用的网络接口) port = 12345 # 服务器端口 receive_image(save_path, host, port) ``` 在上述代码中,你需要将`image.jpg`替换为要发送图片文件路径。在接收端,你需要指定一个保存接收到的图片的路径`received_image.jpg`。此外,你还需要指定发送端和接收端所在的服务器地址和端口。 请注意,这只是一个简单的示例,仅用于演示基本的图片文件传输。在实际应用中,你可能需要添加错误处理、文件大小处理等逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值