一、准备工作
在实现同一局域网下传输图片之前,需要准备以下工具和环境:
-
安装Python。可以从官网(https://www.python.org/downloads/)下载并安装Python,建议选择最新的稳定版本;
-
在摄像头使用情况下,安装OpenCV库,实现图像的读取等操作。可以通过以下命令安装OpenCV:
pip install opencv-python
或者可以通过官网(https://opencv.org/)下载并安装OpenCV。
- 安装Socket库,用于网络数据传输。Socket库是Python内置的标准库,无需额外安装。
二、实现同一局域网下传输图片的方法
- 制作服务器端:
在服务器端,需要先准备好一张本地的图片,代码如下:
import cv2 # 导入OpenCV库
# 加载图片
img = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
# 显示图片
cv2.imshow("Image", img)
cv2.waitKey()
通过上述代码,可以在本地使用OpenCV库加载一张图片,并在图像窗口中显示。
接下来,需要使用Socket库创建一个服务器并监听客户端的连接。代码如下:
import socket # 导入Socket库
# 创建一个服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', 8888))
server_socket.listen(5)
client_socket, addr = server_socket.accept()
通过上述代码,可以创建一个服务器,使用IP地址‘0.0.0.0’和端口号8888,并监听客户端的连接。
在服务器与客户端建立连接后,可以使用OpenCV库将本地的图片数据传输给客户端。代码如下:
import numpy as np
# 将图片编码成bytes类型,并发送给客户端
img_bytes = cv2.imencode('.jpg', img)[1].tobytes()
client_socket.sendall(np.array([len(img_bytes)]).astype(np.int32).tobytes())
client_socket.sendall(img_bytes)
通过上述代码,可以将创建的图片数据编码成bytes类型,并使用Socket库发送给客户端。
- 制作客户端:
在客户端需要先连接到服务器,代码如下:
import socket # 导入Socket库
# 连接服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.connect(('服务器IP地址', 8888))
通过上述代码,可以使用Socket库连接到服务器,并通过指定服务器的IP地址和端口号进行连接。
在连接到服务器之后,可以从服务器接收图片数据,并在本地显示。代码如下:
import cv2 # 导入OpenCV库
import numpy as np
# 从服务器接收图片数据
data = b""
payload_size = struct.calcsize(">L")
while len(data) < payload_size:
data += server_socket.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
while len(data) < msg_size:
data += server_socket.recv(4096)
img_data = data[:msg_size]
# 将bytes类型的数据转换成OpenCV中的Mat类型
nparr = np.frombuffer(img_data, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 显示图像
cv2.imshow("Image", img)
cv2.waitKey()
通过上述代码,可以使用Socket库从服务器接收到编码后的图片数据,将之解码成OpenCV中的Mat类型,最终在图像窗口显示图片。
三、示例说明
- 示例1:实现同一局域网下的摄像头监控并传输数据
在此示例中,需要在服务器端连接摄像头,并实时捕获摄像头拍摄的图像,并使用Socket库将图像数据传输给客户端。代码如下:
服务器端:
import cv2 # 导入OpenCV库
import socket # 导入Socket库
# 创建一个服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', 8888))
server_socket.listen(5)
client_socket, addr = server_socket.accept()
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取摄像头数据
ret, frame = cap.read()
# 将frame编码成bytes类型,并发送给客户端
frame_bytes = cv2.imencode('.jpg', frame)[1].tobytes()
client_socket.sendall(np.array([len(frame_bytes)]).astype(np.int32).tobytes())
client_socket.sendall(frame_bytes)
# 显示图像
cv2.imshow("Image", frame)
cv2.waitKey(1)
客户端:
import cv2 # 导入OpenCV库
import numpy as np
import socket # 导入Socket库
# 连接服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.connect(('服务器IP地址', 8888))
while True:
# 从服务器接收图片数据
data = b""
payload_size = 8
while len(data) < payload_size:
data += server_socket.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
while len(data) < msg_size:
data += server_socket.recv(4096)
frame_data = data[:msg_size]
# 将bytes类型的数据转换成OpenCV中的Mat类型
nparr = np.frombuffer(frame_data, np.uint8)
frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 显示图像
cv2.imshow("Image", frame)
cv2.waitKey(1)
通过上述代码,在服务器端启动摄像头并开始捕获摄像头数据后,客户端可以接收到并显示摄像头数据。
- 示例2:实现同一局域网下的图片传输
在此示例中,需要在服务器端指定需要传输的图片,并使用Socket库传输图片数据给客户端。代码如下:
服务器端:
import cv2 # 导入OpenCV库
import socket # 导入Socket库
# 创建一个服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', 8888))
server_socket.listen(5)
client_socket, addr = server_socket.accept()
# 加载图片
img = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
# 显示图片
cv2.imshow("Image", img)
cv2.waitKey()
# 将图片编码成bytes类型,并发送给客户端
img_bytes = cv2.imencode('.jpg', img)[1].tobytes()
client_socket.sendall(np.array([len(img_bytes)]).astype(np.int32).tobytes())
client_socket.sendall(img_bytes)
客户端:
import cv2 # 导入OpenCV库
import numpy as np
import socket # 导入Socket库
# 连接服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.connect(('服务器IP地址', 8888))
# 从服务器接收图片数据
data = b""
payload_size = 8
while len(data) < payload_size:
data += server_socket.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
while len(data) < msg_size:
data += server_socket.recv(4096)
img_data = data[:msg_size]
# 将bytes类型的数据转换成OpenCV中的Mat类型
nparr = np.frombuffer(img_data, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 显示图像
cv2.imshow("Image", img)
cv2.waitKey()
通过上述代码,在服务器端指定需要传输的图片后,客户端可以接收到并显示图片数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现同一局域网下传输图片 - Python技术站