python实现同一局域网下传输图片

一、准备工作

在实现同一局域网下传输图片之前,需要准备以下工具和环境:

  1. 安装Python。可以从官网(https://www.python.org/downloads/)下载并安装Python,建议选择最新的稳定版本;

  2. 在摄像头使用情况下,安装OpenCV库,实现图像的读取等操作。可以通过以下命令安装OpenCV:

pip install opencv-python

或者可以通过官网(https://opencv.org/)下载并安装OpenCV。

  1. 安装Socket库,用于网络数据传输。Socket库是Python内置的标准库,无需额外安装。

二、实现同一局域网下传输图片的方法

  1. 制作服务器端:

在服务器端,需要先准备好一张本地的图片,代码如下:

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库发送给客户端。

  1. 制作客户端:

在客户端需要先连接到服务器,代码如下:

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. 示例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)

通过上述代码,在服务器端启动摄像头并开始捕获摄像头数据后,客户端可以接收到并显示摄像头数据。

  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技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 魅族16s Pro手机值得买吗 魅族16s Pro手机详细评测

    魅族16s Pro手机值得买吗? 魅族16s Pro手机是一款性价比较高的手机,下面从性能、设计、拍照等方面进行详细评测,帮助大家了解魅族16s Pro手机是否值得购买。 性能 魅族16s Pro手机搭载骁龙855 Plus处理器,采用7nm工艺,性能非常强劲。同时,手机还支持UFS 3.0存储,读取速度非常快。根据跑分表现,在同价位的手机中,魅族16s P…

    人工智能概览 2023年5月25日
    00
  • C++中opencv4.1.0环境配置的详细过程

    下面是C++中opencv4.1.0环境配置的详细过程。 环境准备 在开始配置OpenCV 4.1之前,我们需要安装以下环境: C++ 编译器:GCC 或 Clang CMake 3.10 或更高版本 Git(可选) 安装完成后,我们可以开始配置OpenCV环境了。 下载OpenCV源码 首先,在OpenCV官网上下载OpenCV源码: git clone …

    人工智能概览 2023年5月25日
    00
  • Django超详细讲解图书管理系统的实现

    Django超详细讲解图书管理系统的实现 1. 总体介绍 本篇攻略介绍如何使用Django框架实现一套图书管理系统,主要包括以下几个方面的内容: 数据库设计和使用 Django框架的基本使用 图书管理系统的具体实现 2. 数据库设计 本系统涉及的核心数据有图书、作者、出版社、客户等。我们需要先设计出数据库,并使用Django的ORM对其进行操作。 根据需求,…

    人工智能概览 2023年5月25日
    00
  • Perl5 OOP学习笔记第2/2页

    首先让我解释一下“Perl5 OOP学习笔记第2/2页”的完整攻略。 这篇攻略旨在帮助初学者掌握Perl5面向对象编程(OOP)的基础知识。第2/2页主要分为两个部分:继承和多态。接下来我将为大家逐一介绍。 继承 继承是OOP中非常重要的概念之一,它可以让我们实现代码的重用性、可维护性和可扩展性。在Perl5中,我们可以使用“@ISA”来定义一个或多个父类。…

    人工智能概论 2023年5月25日
    00
  • Windows系统修改Jenkins端口号

    下面是“Windows系统修改Jenkins端口号”的完整攻略: 修改Jenkins端口号 步骤1:停止Jenkins服务 首先需要停止正在运行的Jenkins服务。可以进入控制面板 – 管理工具 – 服务,找到并停止Jenkins服务。 步骤2:编辑Jenkins配置文件 Jenkins的端口号在配置文件中进行配置,可以通过编辑配置文件实现修改。配置文件位…

    人工智能概览 2023年5月25日
    00
  • conda常用命令整理及用法详解

    Conda常用命令整理及用法详解 Conda是一个Python的包管理器,它可以方便地安装、更新和删除Python包及其依赖项。本文将介绍一些conda常用命令,并详细说明它们的用法。 1. Conda环境管理 1.1 创建和管理环境 创建环境:可以使用conda create命令创建一个新的conda环境。 conda create –name env_…

    人工智能概览 2023年5月25日
    00
  • MongoDB单表数据的导出和恢复实例讲解

    下面我将详细讲解“MongoDB单表数据的导出和恢复实例讲解”的完整攻略,过程中包含两条示例说明。 一、MongoDB单表数据的导出 1.1 通过mongoexport命令导出数据 在MongoDB中,我们可以通过使用mongoexport命令将数据导出到一个文件中。其基本语法如下: mongoexport -d dbname -c collectionna…

    人工智能概览 2023年5月25日
    00
  • 简单不求人 轻松让你击破ATA硬盘密码

    简单不求人 轻松让你击破ATA硬盘密码 什么是ATA硬盘密码 ATA(Advanced Technology Attachment)硬盘密码是一种硬件层面的安全措施,能够加密并保护硬盘中的数据。只有在输入正确密码之后,才能使用这个硬盘。 准备工作 为了攻破ATA硬盘密码,你需要准备以下工具: 一个 ATA-to-USB转换器,或者一个已经安装好ATA接口的计…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部