GsCtp 2025-06-21 00:33 采纳率: 0%
浏览 9

图传不报错但没有图像

我想要使用如下代码实现UDP图传:


# coding=utf-8
import socket
import numpy as np
import cv2

UDP_IP = '192.168.1.157'
UDP_PORT = 12345

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

# 初始化接收缓冲区
pkt_header_size = 8  # 4字节魔数 + 4字节长度
expected_size = 0
received_data = bytearray()

def smart_upscale(frame, scale):
    return cv2.resize(
        frame,
        (frame.shape[1]*scale, frame.shape[0]*scale),
        interpolation=cv2.INTER_NEAREST  # 可替换为INTER_LINEAR获得更好质量
    )

while True:
    data, addr = sock.recvfrom(65535)
    
    # 处理包头
    if len(data) == pkt_header_size:
        magic = int.from_bytes(data[:4], 'big')
        if magic == 0xABCD1234:
            expected_size = int.from_bytes(data[4:8], 'big')
            received_data = bytearray()
            continue
    
    # 收集数据包
    received_data.extend(data)
    
    # 数据接收完成
    if len(received_data) >= expected_size and expected_size > 0:
        # 解码图像
        img = cv2.imdecode(np.frombuffer(received_data[:expected_size], np.uint8), cv2.IMREAD_COLOR)
        big_img = smart_upscale(img, 4)
        if img is not None:
            cv2.imshow("Receiver Preview", big_img)
        # 重置状态
        expected_size = 0
        received_data = bytearray()
    
    if cv2.waitKey(1) == 27:
        break

cv2.destroyAllWindows()

windows中运行该程序,同时连接摄像头的开发板上运行相应的程序,程序在正常的运行但是没有图像出现,由于没有报错,IP地址应该是没问题的

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-06-21 00:33
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    图传不报错但没有图像

    你使用的代码应该可以正确地发送 UDP 图像,但是图像并没有被正确地接收和显示。下面是一些可能的原因和解决方案:

    1. 接收端的 IP 地址和端口号:在发送端,你设置的 UDP_IP 是 '192.168.1.1',但是你需要确保接收端的 IP 地址和端口号是正确的。
    2. 图像编码和解码:在发送端,你使用 cv2.imencode 将图像编码为 JPEG,然而在接收端,你需要使用相应的解码方式来解码图像。
    3. 数据包的大小和 fragmentation:UDP 图像传输可能会导致数据包的大小超过网络的 MTU(Maximum Transmission Unit),这可能会导致图像的破损或丢失。

    解决方案:

    1. 在发送端,使用 socket.socket 创建 UDP 套接字,并使用 setsockopt 设置套接字的缓冲区大小和超时时间。
    2. 在接收端,使用 socket.socket 创建 UDP 套接字,并使用 bind 绑定到正确的 IP 地址和端口号。
    3. 在发送端,使用 cv2.imencode 将图像编码为 JPEG,并使用 socket.sendto 发送图像数据。
    4. 在接收端,使用 socket.recvfrom 接收图像数据,并使用 cv2.imdecode 解码图像。

    以下是一个简单的示例代码:

    # 发送端
    import socket
    import cv2
    
    UDP_IP = '192.168.1.1'
    UDP_PORT = 1234
    
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        img_encode = cv2.imencode('.jpg', frame)
        img_data = img_encode[1]
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.sendto(img_data, (UDP_IP, UDP_PORT))
        sock.close()
    
    # 接收端
    import socket
    import cv2
    
    UDP_IP = '192.168.1.2'
    UDP_PORT = 1234
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind((UDP_IP, UDP_PORT))
    while True:
        data, addr = sock.recvfrom(1024)
        img_decode = cv2.imdecode(data, cv2.IMREAD_COLOR)
        cv2.imshow('Image', img_decode)
        cv2.waitKey(1)
        cv2.destroyAllWindows()
    

    请注意,这只是一个简单的示例代码,你可能需要根据你的实际情况进行修改和优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月21日