怎么在网站添加链接,兰州做网站哪家专业,万表手表官网,小程序分销功能是怎么实现的python socket网络编程
将ros机器人摄像头捕捉的画面在上位机实时显示#xff0c;需要用到socket网络编程#xff0c;提供了TCP和UDP两种方式
TCP服务器端代码:
创建TCP套接字: s socket(AF_INET, SOCK_STREAM) 创建了一个TCP套接字。SOCK_STREAM 表示这是一个TCP套接字需要用到socket网络编程提供了TCP和UDP两种方式
TCP服务器端代码:
创建TCP套接字: s socket(AF_INET, SOCK_STREAM) 创建了一个TCP套接字。SOCK_STREAM 表示这是一个TCP套接字而不是UDP的 SOCK_DGRAM。 绑定地址: s.bind(addr) 将套接字绑定到一个特定的地址和端口上。 监听连接: s.listen(1) 使套接字开始监听连接请求。参数 1 表示最多可以有一个待处理的连接。 接受连接: conn, addr s.accept() 阻塞直到客户端连接。一旦客户端连接它将返回一个新的套接字对象和客户端的地址。 接收和处理数据: 在一个循环中data conn.recv(921600) 从新的套接字对象接收数据。使用 cv2.imdecode 和 cv2.imshow 处理和显示接收到的图像数据。如果按下 ‘q’ 键循环将终止。 清理: conn.close() 关闭客户端连接。s.close() 关闭监听套接字。cv2.destroyAllWindows() 关闭所有OpenCV窗口。
import numpy as np
import cv2
from socket import *# 创建TCP套接字
s socket(AF_INET, SOCK_STREAM)
addr (127.0.0.1, 8080)
s.bind(addr)
s.listen(1) # 监听连接参数1表示最大连接数print(Waiting for a connection...)
conn, addr s.accept() # 接受连接
print(fConnection from {addr})try:while True:data conn.recv(921600) # 接收数据if not data:break # 如果没有数据退出循环receive_data np.frombuffer(data, dtypeuint8)r_img cv2.imdecode(receive_data, 1)r_img r_img.reshape(480, 640, 3)cv2.putText(r_img, server, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)cv2.imshow(server_frame, r_img)if cv2.waitKey(1) 0xFF ord(q):break
finally:conn.close() # 关闭连接s.close() # 关闭套接字cv2.destroyAllWindows()
TCP客户端:
创建TCP套接字: 同样使用 s socket(AF_INET, SOCK_STREAM) 创建一个TCP套接字。 连接到服务器: s.connect(addr) 尝试连接到服务器的地址和端口。 捕获和处理图像: 在一个循环中使用 cv2.VideoCapture 捕获图像并通过 cv2.flip 对图像进行处理。 发送图像数据: 创建一个新线程 th 来调用 send_img 函数并使用 th.start() 启动线程。send_img 函数中使用 cv2.imencode 将图像编码为JPEG格式然后使用 s.sendall(send_data) 将图像数据发送到服务器。 显示图像: 在本地显示处理过的图像并检查是否按下了 ‘q’ 键来决定是否退出循环。 清理: s.close() 关闭TCP套接字。cv2.destroyAllWindows() 关闭所有OpenCV窗口。
import cv2
import threading
from socket import *def send_img():_, send_data cv2.imencode(.jpg, img, [cv2.IMWRITE_JPEG_QUALITY, 50])s.sendall(send_data) # 发送所有数据print(f已发送{len(send_data)}Bytes的数据)addr (127.0.0.1, 8080)
cap cv2.VideoCapture(0)s socket(AF_INET, SOCK_STREAM)
s.connect(addr) # 连接到服务器try:while True:_, img cap.read()img cv2.flip(img, 1)th threading.Thread(targetsend_img)th.setDaemon(True)th.start()cv2.putText(img, client, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)cv2.imshow(client_frame, img)if cv2.waitKey(1) 0xFF ord(q):break
finally:s.close() # 关闭套接字cv2.destroyAllWindows()
导入必需的库: sys 和 os 是Python的标准库用于访问与Python解释器和操作系统交互的一些功能。numpy 是一个用于数值计算的库。cv2 是OpenCV库的Python接口用于图像处理和计算机视觉任务。threading 和 time 是Python的标准库分别用于多线程编程和时间相关的功能。socket 是Python的标准库用于网络通信。 创建一个UDP套接字: s socket(AF_INET, SOCK_DGRAM) 这行代码创建了一个新的UDP套接字。 绑定套接字到地址: addr (127.0.0.1, 8080) 这行代码定义了一个地址其中 127.0.0.1 是本机的IP地址8080 是端口号。s.bind(addr) 这行代码将套接字绑定到指定的地址。 接收和处理数据: 这个脚本进入一个无限循环等待接收数据。data, _ s.recvfrom(921600) 这行代码从套接字接收数据最多接收921600字节的数据。receive_data np.frombuffer(data, dtypeuint8) 这行代码将接收到的数据转换为一个numpy数组。r_img cv2.imdecode(receive_data, 1) 这行代码解码接收到的数据将其转换为一个OpenCV图像对象。r_img r_img.reshape(480, 640, 3) 这行代码将图像重塑为480x640的大小并指定该图像有3个颜色通道。cv2.putText(...) 这行代码将文本 “server” 画到图像上。cv2.imshow(server_frame, r_img) 这行代码显示处理后的图像。if cv2.waitKey(1) 0xFF ord(q): 这行代码检查是否按下了键 ‘q’如果是则退出循环。 清理: cv2.destroyAllWindows() 这行代码关闭所有OpenCV窗口。
UDP服务器端:
import sys, osimport numpy as np
import cv2, threading, time
from socket import *s socket(AF_INET, SOCK_DGRAM)
# addr (192.168.64.1, 8080)
addr (127.0.0.1, 8080) # 127.0.0.1表示本机的IP相当于我和“自己”的关系
s.bind(addr)
while True:data, _ s.recvfrom(921600)receive_data np.frombuffer(data, dtypeuint8)r_img cv2.imdecode(receive_data, 1)r_img r_img.reshape(480, 640, 3)cv2.putText(r_img, server, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)cv2.imshow(server_frame, r_img)if cv2.waitKey(1) 0xFF ord(q):breakcv2.destroyAllWindows()导入必需的库: 同样导入了numpy, cv2, threading, time和socket库。 定义 send_img 函数: send_img 函数中通过 s.sendto(send_data, addr) 语句将图像数据发送到指定的地址。输出已发送的数据大小并通过 s.close() 关闭套接字。 设置地址: addr (127.0.0.1, 8080) 设置了目标地址和端口。 初始化摄像头: 通过 cv2.VideoCapture(0) 初始化摄像头并进入一个无限循环。 捕获和处理图像: 在循环中通过 _, img cap.read() 语句捕获图像。通过 cv2.flip(img, 1) 语句将图像进行水平翻转。 创建并启动发送图像数据的线程: 创建一个新的UDP套接字。创建一个新线程 th并将 send_img 函数设置为该线程的目标。通过 th.setDaemon(True) 将线程设置为守护线程这意味着主程序退出时该线程也会退出。通过 cv2.imencode(.jpg, img, [cv2.IMWRITE_JPEG_QUALITY, 50]) 语句将图像编码为JPEG格式质量设置为50。通过 th.start() 语句启动线程。 显示图像: 通过 cv2.putText(...) 和 cv2.imshow(client_frame, img) 语句在本地显示图像并在图像上添加了文本 “client”。 退出条件: 如果按下’q’键通过 cv2.waitKey(1) 0xFF ord(q) 语句检测到这一条件并退出循环。 清理: 通过 cv2.destroyAllWindows() 语句关闭所有OpenCV窗口。
该脚本应该与你之前提供的服务器脚本配合使用服务器脚本用于接收图像数据而这个客户端脚本用于发送图像数据。
UDP客户端:
import numpy as np
import cv2, threading, time
from socket import *def send_img():s.sendto(send_data, addr)print(f已发送{img.size}Bytes的数据)s.close()# input()# addr (192.168.43.106, 8080)
addr (127.0.0.1, 8080) # 127.0.0.1表示本机的IP相当于我和“自己”的关系
cap cv2.VideoCapture(0)
while True:_, img cap.read()img cv2.flip(img, 1)s socket(AF_INET, SOCK_DGRAM)th threading.Thread(targetsend_img)th.setDaemon(True)_, send_data cv2.imencode(.jpg, img, [cv2.IMWRITE_JPEG_QUALITY, 50])th.start()cv2.putText(img, client, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)cv2.imshow(client_frame, img)if cv2.waitKey(1) 0xFF ord(q):breakcv2.destroyAllWindows()