python socket 传输opencv读取的图像
python socket网络编程
将ros机器人摄像头捕捉的画面在上位机实时显示,需要用到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(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客户端:
- 创建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(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()- 导入必需的库: - 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, 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’,如果是,则退出循环。
 
- 清理: - 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()
- 导入必需的库: - 同样导入了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')语句检测到这一条件,并退出循环。
 
- 如果按下’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(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 中可以找到外接显示器,但是卡顿明显…...
 
【计算机网络】高级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,此监控方法似乎用的人…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
 
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
 
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
 
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
 
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
 
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
