当前位置: 首页 > 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,此监控方法似乎用的人…...

ARM GICv4.1 GICD_TYPER2寄存器详解与虚拟化应用

1. GICD_TYPER2寄存器概述 GICD_TYPER2是ARM GICv4.1架构中引入的关键寄存器,属于中断控制器类型寄存器家族。作为GIC Distributor的一部分,它专门用于增强虚拟化场景下的中断管理能力。这个32位寄存器位于内存映射地址Dist_base 0x000C处,仅…...

C#初步认识/入门基础

一、注释/运行/项目介绍1.注释1.// 双斜杠是单行注释,注释代码不会被执行;/* */是多行注释格式。两种均不会被执行;.///三斜杠一般写在方法前//1111/*111*11*////11112.运行2.运行调试 : 实心三角(运行控制台后会消失…...

AI意识与认知操控:技术伦理、风险与治理框架

1. 项目概述:当“意识”成为可编程对象最近几年,我身边不少从事AI研发的朋友,聊天时的话题已经从“模型精度又提升了几个点”逐渐转向了一些更“虚”但更根本的问题。比如,我们训练的大语言模型,在和我们进行几轮深度对…...

汽车软件化演进:从原生应用到手机集成的技术路径与实战解析

1. 从机械到智能:汽车软件化的十字路口十年前,当福特和通用汽车开始在硅谷和南加州大肆招聘软件工程师时,很多人可能还没意识到,这不仅仅是一次普通的“招兵买马”,而是一场深刻改变汽车工业基因的序曲。2014年那会儿&…...

利用ODX实现整车诊断数据库管理

一:背景与挑战| 背景:在全球汽车行业快速发展的背景下,对车辆诊断技术的要求也在不断提升。ODX(Open Diagnostic data eXchange)作为行业标准的诊断数据库,已被各大汽车制造商广泛采用,并贯穿于ECU的整个生…...

Go语言构建高效命令行工具集:从设计到工程化实践

1. 项目概述:一个“好用的”开源工具集最近在GitHub上闲逛,发现了一个挺有意思的仓库,叫ImGoodBai/goodable。光看这个名字,就透着一股子“实用主义”的气息——“好用的”。作为一名常年混迹于开源社区,喜欢折腾各种工…...

硬件相关项目内容介绍(硬件咱们也有相关技术支持内容哦)

硬件相关项目内容介绍(硬件咱们也有相关技术支持内容哦) 硬件咱们也有相关技术支持内容哦。 主要看大家喜欢什么,硬件内容咱们会不定期更新分享,大家要是喜欢,后续就安排上实物实操。也虚心听取大家建议,不…...

Resolink MCP:基于MCP协议与Playwright的AI浏览器自动化实践

1. 项目概述:当AI助手学会“动手”——Resolink MCP的浏览器自动化革命如果你和我一样,每天在Cursor、Claude这类AI编程助手的陪伴下写代码,那你一定遇到过这样的场景:你正和AI热烈讨论一个技术方案,突然需要去浏览器里…...

在株洲如何根据个人需求选择合适的床垫?

如何根据个人需求选择合适的床垫?在快节奏的现代生活中,一张舒适的床垫对于保证良好的睡眠质量至关重要。然而,面对市场上琳琅满目的床垫产品,如何根据个人需求选择一款合适的床垫呢?本文将从多个维度出发,…...

技术生态依赖的实质与破局:从Android到自主可控的实践路径

1. 项目背景与核心议题解析最近在整理行业资料时,翻到一篇2013年的旧文,讨论的是当时中国工信部对国内移动产业过度依赖Android系统的担忧。虽然时过境迁,但文中提到的“技术自主可控”与“全球生态融入”之间的张力,在今天看来依…...