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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148010.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

算法——买卖股票问题

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 一、 究其就是个动态规划的问题 算法实现图 初始化 由于有三个阶段,买入,可交易,冷冻期,那么用dp表表示现在为止的最大利润,则有 dp[0][…

asp.net core 远程调试

大概说下过程: 1、站点发布使用Debug模式 2、拷贝到远程服务器,以及iis创建站点。 3、本地的VS2022的安装目录:C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE下找Remote Debugger 你的服务器是64位就拷贝x64的目…

详解Linux的系统调用fork()函数

在Linux系统中,fork()是一个非常重要的系统调用,它的作用是创建一个新的进程。具体来说,fork()函数会在当前进程的地址空间中复制一份子进程,并且这个子进程几乎完全与父进程相同,包括进程代码、数据、堆栈以及打开的文…

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC ,碰到的问题只能上安全的WebSocket(WSS)才能解决,配置证书还是挺麻烦的,主要是每年都需要重新更新证书,我配置过的证书最长有效期也只有两年,搞不…

ElasticSearch第四讲:ES详解:ElasticSearch和Kibana安装

ElasticSearch第四讲:ES详解:ElasticSearch和Kibana安装 本文是ElasticSearch第四讲:ElasticSearch和Kibana安装,主要介绍ElasticSearch和Kibana的安装。了解完ElasticSearch基础和Elastic Stack生态后,我们便可以开始…

ctfshow—1024系列练习

1024 柏拉图 有点像rce远程执行,有四个按钮,分别对应四份php文件,开始搞一下。一开始,先要试探出 文件上传到哪里? 怎么读取上传的文件? 第一步:试探上传文件位置 直接用burp抓包,…

力扣练习——链表在线OJ

目录 提示: 一、移除链表元素 题目: 解答: 二、反转链表 题目: 解答: 三、找到链表的中间结点 题目: 解答: 四、合并两个有序链表(经典) 题目: 解…

【数据结构---排序】很详细的哦

本篇文章介绍数据结构中的几种排序哦~ 文章目录 前言一、排序是什么?二、排序的分类 1.直接插入排序2.希尔排序3.选择排序4.冒泡排序5.快速排序6.归并排序总结 前言 排序在我们的生活当中无处不在,当然,它在计算机程序当中也是一种很重要的操…

聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型

聊聊常见的IO模型 BIO/NIO/AIO/DIO、IO多路复用等IO模型 文章目录 一、前言1. 什么是IO模型2. 为什么需要IO模型 二、常见的IO模型1. 同步阻塞IO(Blocking IO,BIO)2. 同步非阻塞IO(Non-blocking IO,NIO)3.…

排序算法之【希尔排序】

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

八大排序源码(含优化)

文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好,我是纪宁,这篇文章是关…

java Spring Boot 自动启动热部署 (别再改点东西就要重启啦)

上文 java Spring Boot 手动启动热部署 我们实现了一个手动热部署的代码 但其实很多人会觉得 这叫说明热开发呀 这么捞 写完还要手动去点一下 很不友好 其实我们开发人员肯定是希望重启这种事不需要自己手动去做 那么 当然可以 我们就让它自己去做 Build Project 这个操作 我们…

Linux性能优化--性能工具:系统内存

3.0.概述 本章概述了系统级的Linux内存性能工具。本章将讨论这些工具可以测量的内存统计信息,以及如何使用各种工具收集这些统计结果。阅读本章后,你将能够: 理解系统级性能的基本指标,包括内存的使用情况。明白哪些工具可以检索…

Java21 新特性

文章目录 1. 概述2. JDK21 安装与配置3. 新特性3.1 switch模式匹配3.2 字符串模板3.3 顺序集合3.4 记录模式(Record Patterns)3.5 未命名类和实例的main方法(预览版)3.6 虚拟线程 1. 概述 2023年9月19日 ,Oracle 发布了…

电子计算机核心发展(继电器-真空管-晶体管)

目录 继电器 最大的机电计算机之一——哈弗Mark1号,IBM1944年 背景 组成 性能 核心——继电器 简介 缺点 速度 齿轮磨损 Bug的由来 真空管诞生 组成 控制开关电流 继电器对比 磨损 速度 缺点 影响 代表 第一个可编程计算机 第一个真正通用&am…

使用晶体管做布尔逻辑和逻辑门

目录 二进制,三进制,五进制 true,false表示0,1 早期计算机采用进制 布尔逻辑 三个基本操作:NOT,AND,OR 基础“真值表” NOT 如何实现? AND如何实现? OR如何实现? 图标表示…

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读:2023年9月25日,Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节,主要核心要点总结如下: >> 数据处…

数据分析方法:RFM模型

一、RFM基本原理 RFM是三个单词的缩写: 最近一次消费时间(Recency),取数的时候一般取最近一次消费记录到当前时间的间隔,比如:7天、30天、90天未到店消费;直观上,一个用户太久不到…

【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 1 篇:计算机系统概述

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术有限&#xff…

由于计算机中丢失msvcp110.dll的解决方法与msvcp110.dll丢失修复方法

相信大家在打开电脑软件或许游戏都有遇到过电脑提示找不到msvcp110.dll文件,导致软件游戏打不开,我们应该怎么办?不用着急,今天小编我分享我找了很久成功解决问题的方法给大家,希望可以帮到各位。 1. 使用DLL修复工具&…