当前位置: 首页 > news >正文

python socket 传输opencv读取的图像

python socket网络编程

将ros机器人摄像头捕捉的画面在上位机实时显示,需要用到socket网络编程,提供了TCP和UDP两种方式

TCP服务器端代码:

  1. 创建TCP套接字:
    • s = socket(AF_INET, SOCK_STREAM) 创建了一个TCP套接字。SOCK_STREAM 表示这是一个TCP套接字,而不是UDP的 SOCK_DGRAM
  2. 绑定地址:
    • s.bind(addr) 将套接字绑定到一个特定的地址和端口上。
  3. 监听连接:
    • s.listen(1) 使套接字开始监听连接请求。参数 1 表示最多可以有一个待处理的连接。
  4. 接受连接:
    • conn, addr = s.accept() 阻塞,直到客户端连接。一旦客户端连接,它将返回一个新的套接字对象和客户端的地址。
  5. 接收和处理数据:
    • 在一个循环中,data = conn.recv(921600) 从新的套接字对象接收数据。
    • 使用 cv2.imdecodecv2.imshow 处理和显示接收到的图像数据。
    • 如果按下 ‘q’ 键,循环将终止。
  6. 清理:
    • 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(f"Connection from {addr}")try:while True:data = conn.recv(921600)  # 接收数据if not data:break  # 如果没有数据,退出循环receive_data = np.frombuffer(data, dtype='uint8')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客户端:

  1. 创建TCP套接字:
    • 同样使用 s = socket(AF_INET, SOCK_STREAM) 创建一个TCP套接字。
  2. 连接到服务器:
    • s.connect(addr) 尝试连接到服务器的地址和端口。
  3. 捕获和处理图像:
    • 在一个循环中,使用 cv2.VideoCapture 捕获图像,并通过 cv2.flip 对图像进行处理。
  4. 发送图像数据:
    • 创建一个新线程 th 来调用 send_img 函数,并使用 th.start() 启动线程。
    • send_img 函数中,使用 cv2.imencode 将图像编码为JPEG格式,然后使用 s.sendall(send_data) 将图像数据发送到服务器。
  5. 显示图像:
    • 在本地显示处理过的图像,并检查是否按下了 ‘q’ 键来决定是否退出循环。
  6. 清理:
    • 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(target=send_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()
  1. 导入必需的库:
    • sysos 是Python的标准库,用于访问与Python解释器和操作系统交互的一些功能。
    • numpy 是一个用于数值计算的库。
    • cv2 是OpenCV库的Python接口,用于图像处理和计算机视觉任务。
    • threadingtime 是Python的标准库,分别用于多线程编程和时间相关的功能。
    • socket 是Python的标准库,用于网络通信。
  2. 创建一个UDP套接字:
    • s = socket(AF_INET, SOCK_DGRAM) 这行代码创建了一个新的UDP套接字。
  3. 绑定套接字到地址:
    • addr = ('127.0.0.1', 8080) 这行代码定义了一个地址,其中 127.0.0.1 是本机的IP地址,8080 是端口号。
    • s.bind(addr) 这行代码将套接字绑定到指定的地址。
  4. 接收和处理数据:
    • 这个脚本进入一个无限循环,等待接收数据。
    • data, _ = s.recvfrom(921600) 这行代码从套接字接收数据,最多接收921600字节的数据。
    • receive_data = np.frombuffer(data, dtype='uint8') 这行代码将接收到的数据转换为一个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’,如果是,则退出循环。
  5. 清理:
    • 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, dtype='uint8')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()
  1. 导入必需的库:
    • 同样导入了numpy, cv2, threading, timesocket库。
  2. 定义 send_img 函数:
    • send_img 函数中,通过 s.sendto(send_data, addr) 语句将图像数据发送到指定的地址。
    • 输出已发送的数据大小,并通过 s.close() 关闭套接字。
  3. 设置地址:
    • addr = ('127.0.0.1', 8080) 设置了目标地址和端口。
  4. 初始化摄像头:
    • 通过 cv2.VideoCapture(0) 初始化摄像头,并进入一个无限循环。
  5. 捕获和处理图像:
    • 在循环中,通过 _, img = cap.read() 语句捕获图像。
    • 通过 cv2.flip(img, 1) 语句将图像进行水平翻转。
  6. 创建并启动发送图像数据的线程:
    • 创建一个新的UDP套接字。
    • 创建一个新线程 th,并将 send_img 函数设置为该线程的目标。
    • 通过 th.setDaemon(True) 将线程设置为守护线程,这意味着主程序退出时,该线程也会退出。
    • 通过 cv2.imencode('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50]) 语句将图像编码为JPEG格式,质量设置为50。
    • 通过 th.start() 语句启动线程。
  7. 显示图像:
    • 通过 cv2.putText(...)cv2.imshow('client_frame', img) 语句在本地显示图像,并在图像上添加了文本 “client”。
  8. 退出条件:
    • 如果按下’q’键,通过 cv2.waitKey(1) & 0xFF == ord('q') 语句检测到这一条件,并退出循环。
  9. 清理:
    • 通过 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(target=send_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()

相关文章:

python socket 传输opencv读取的图像

python socket网络编程 将ros机器人摄像头捕捉的画面在上位机实时显示,需要用到socket网络编程,提供了TCP和UDP两种方式 TCP服务器端代码: 创建TCP套接字: s socket(AF_INET, SOCK_STREAM) 创建了一个TCP套接字。SOCK_STREAM 表示这是一个TCP套接字&…...

APACHE NIFI学习之—UpdateAttribute

UpdateAttribute 描述: 通过设置属性表达式来更新属性,也可以基于属性正则匹配来删除属性 标签: attributes, modification, update, delete, Attribute Expression Language, state, 属性, 修改, 更新, 删除, 表达式 参数: 如下列表中,必填参数则…...

BIT-7文件操作和程序环境(16000字详解)

一:文件 1.1 文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明…...

冥想第九百二十八天

1.今天周三,今天晚上日语课上了好久,天气也不好, 2.项目上全力以赴的一天。 3.感谢父母,感谢朋友感谢家人,感谢不断进步的自己。...

深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)

目录 前言 环境配置 Quartz 什么是Quartz? 应用场景 核心组件 Job JobDetail Trigger CronTrigger SimpleTrigger Scheduler 任务存储 RAM JDBC 导入依赖 定时任务 销量统计 Redis检测 使用 ​编辑 注意事项 前言 在悦享校园1.0中引入了Quart…...

Lucene-MergePolicy详解

简介 该文章基于业务需求背景,因场景需求进行参数调优,下文会尽可能针对段合并策略(SegmentMergePolicy)的全参数进行说明。 主要介绍TieredMergePolicy,它是Lucene4以后的默认段的合并策略,之前采用的合并…...

数据的加解密

文章目录 分类特点业务的使用补充 分类 对称加密算法非对称加密算法 特点 对称加密算法 : 加密效率高 !加密和解密都使用同一款密钥 但是有一个问题 : 密钥如何从服务端发给客户端? (假如你直接先将密钥发给对方,要是在过程中被黑客技术破解了,那后面的消息也就泄漏了) (后…...

【Spring】更简单的读取和存储对象

更简单的读取和存储对象 一. 存储 Bean 对象1. 前置工作:配置扫描路径2. 添加注解存储 Bean 对象Controller(控制器存储)Service(服务存储)Repository(仓库存储)Component(组件存储&…...

【LeetCode热题100】--108.将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二叉搜索树的中序遍历是升序…...

Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群

十一、持久化RDB和AOF 持久化:将数据存入硬盘 11.1 RDB(Redis Database) RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。 备份…...

【智能家居项目】裸机版本——设备子系统(LED Display 风扇)

🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 输入子系统中目前仅实现了按键输入,剩下的网络输入和标准输入在以后会逐步实现&am…...

[Linux]记录plasma-wayland下无法找到HDMI接口显示器的问题解决方案

内核:Linux 6.5.5-arch1-1 Plasma 版本:5.27.8 窗口系统:Wayland 1 问题 在前些时候置入了一块显示器,接口较多,有 HDMI 接口,type-C 接口。在 X11 中可以找到外接显示器,但是卡顿明显&#xf…...

【计算机网络】高级IO之select

文章目录 1. 什么是IO?什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误?对错误码的进一步判断检测数据没有就绪时,返回做一些其他事情完整代码myt…...

如何设计一个高效的应用缓冲区【一个动态扩容的buffer类】

文章目录 前言一、为什么需要设计应用层缓冲区必须要有 output buffer目的问题output buffer的解决方案: 必须要有 input buffer总结 二、设计要点三、buffer设计思路基础函数关于iovec与readv readfd如何实现动态扩容 问题 前言 在上一个博客,我们介绍…...

图像处理初学者导引---OpenCV 方法演示项目

OpenCV 方法演示项目 项目地址:https://github.com/WangQvQ/opencv-tutorial 项目简介 这个开源项目是一个用于演示 OpenCV 方法的工具,旨在帮助初学者快速理解和掌握 OpenCV 图像处理技术。通过这个项目,你可以轻松地对图像进行各种处理&a…...

管道-匿名管道

一、管道介绍 管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。 1. 创建和使用管道&#…...

【JavaEE基础学习打卡08】JSP之初次认识say hello!

目录 前言一、JSP技术初识1.动态页面2.JSP是什么3.JSP特点有哪些 二、JSP运行环境配置1.JDK安装2.Tomcat安装 三、编写JSP1.我的第一个JSP2.JSP执行过程3.在IDEA中开发JSP 总结 前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高…...

使用序列到序列深度学习方法自动睡眠阶段评分

深度学习方法,用于使用单通道脑电图进行自动睡眠阶段评分。 def build_firstPart_model(input_var,keep_prob_0.5):# List to store the output of each CNNsoutput_conns []######### CNNs with small filter size at the first layer ########## Convolutionnetw…...

【算法】排序——选择排序和交换排序(快速排序)

主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏…...

Docker 容器监控 - Weave Scope

Author:rab 目录 前言一、环境二、部署三、监控3.1 容器监控 - 单 Host3.2 容器监控 - 多 Host 总结 前言 Docker 容器的监控方式有很多,如 cAdvisor、Prometheus 等。今天我们来看看其另一种监控方式 —— Weave Scope,此监控方法似乎用的人…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...