python socket 传输opencv读取的图像

这篇具有很好参考价值的文章主要介绍了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, os

import 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'):
        break

cv2.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窗口。

该脚本应该与你之前提供的服务器脚本配合使用,服务器脚本用于接收图像数据,而这个客户端脚本用于发送图像数据。文章来源地址https://www.toymoban.com/news/detail-737911.html

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'):
        break

cv2.destroyAllWindows()

到了这里,关于python socket 传输opencv读取的图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv-python读取的图像分辨率太大不能完全显示

    如果使用OpenCV-Python读取的图像分辨率太大,无法完全显示在屏幕上,可以考虑以下几种方法: 1.缩放图像:使用OpenCV的resize函数,将图像缩小到适合屏幕显示的大小。例如,可以将图像的宽度和高度都缩小到屏幕宽度和高度的一半。 2.平移图像:如果只是图像的一部分超出了

    2024年02月03日
    浏览(45)
  • python opencv 读取文件夹下所有MP4文件并解析成jpg图像

    你可以使用Python的OpenCV库来读取文件夹中的所有MP4文件,并将其解析为JPG图像。以下是一个示例代码,演示了如何实现这个功能,并设置解析间隔为3帧: 请确保你已经安装了OpenCV库(可以使用pip install opencv-python进行安装)。将代码中的\\\"path/to/input/folder\\\"替换为包含MP4文件的实

    2024年01月19日
    浏览(58)
  • [Python] pyqt6+opencv实现摄像头图像的实时读取并显示(完整源代码)

    本文将会介绍如何通过opencv来实时捕获摄像头的图像,并通过pyqt6进行图像视频呈现。 1. 通过opencv的VideoCapture类读取摄像头的每一帧图像,通过pyqt6的QLabel来显示图像 2. 根据获取的图像的宽和高大小以及QLabel的大小来动态调整最后输出的图像的宽和高 3. 调整窗体大小,动态调

    2024年01月24日
    浏览(67)
  • python用socket传输图片

    本来想一次连接发送多张图片,但由于处理间隔的逻辑容易导致图片丢失等问题,所以这里采用的是每次连接只发送一张图片 发送的形式是base64编码,可以有效的适用于各种项目 客户端 服务端 服务器与连接分离处理,可以有效控制连接,避免单个连接影响服务运行

    2024年02月19日
    浏览(33)
  • 【python】socket-传输多个文件、大文件

    看过挺多个发文件的例子,但是基本都是发单个,且是 发完连接就结束了 最近正好需要 一个连接 发送 多个文件 ,根据需求产生以下内容 涉及知识点:socket 的客户端和服务端应用、json、TCP粘包处理 【客户端】获取文件信息 必备:大小 可选:文件名、文件绝对路径 【客户

    2024年02月14日
    浏览(43)
  • Python中使用OpenCV读取灰度图像时遇到的错误:module ‘cv2‘ has no attribute ‘CV_LOAD_IMAGE_GRAYSCA...

    Python中使用OpenCV读取灰度图像时遇到的错误:module ‘cv2’ has no attribute ‘CV_LOAD_IMAGE_GRAYSCALE’。 OpenCV是一款广泛应用于计算机视觉领域的开源计算机视觉库,它可以实现图像处理、分析、识别等功能。而在使用OpenCV读取灰度图像时,可能会出现上述错误。 这个错误发生的原

    2024年02月16日
    浏览(57)
  • opencv读取灰度图像

    本文档创建于2023年3月10日 本文记录了C++版opencv读取灰度图像的不同方式及区别 作者:RobotFreak C++版的 opencv 读取灰度图像可以有不同的方法,这里列出几种方法,并简述它们的区别。 这里用到的两张图片为lena.jpg(彩色)和lena.bmp(灰度) 图像本身就是灰度图像,直接使用

    2024年02月06日
    浏览(63)
  • openCV图像读取和显示

    运行 imread是OpenCV图像处理库中的一个函数,用于从文件中读取图像数据并将其存储为一个Mat对象 其中,参数filename指定了要读取的图像文件的路径和文件名;参数flags指定了读取图像时的标志,它是一个可选参数,默认值为IMREAD_COLOR,表示读取彩色图像。 imread函数支持读取多

    2024年02月14日
    浏览(38)
  • Opencv 图像的读取与写入

    目录 导入cv2 读取图像数据 创建一个窗口 waitKey方法 关闭所有窗口 完整示例 保存图片 示例  

    2024年02月11日
    浏览(49)
  • opencv imread图像读取不成功

    不论是imread读取相对路径还是绝对路径,如果imread读取不成功,显示Nnoe,很有可能是你的路径名字中含有中文,检查你的路径中是否含有中文,有的话将其改为英文。 在Python中,使用绝对路径时,通常需要在路径字符串中使用反斜杠()来分隔目录和文件名。但需要注意的是

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包