Example: 08-RPC-Library/34-Remote-Control/image_transfer_jpg_as_the_remote_device_for_your_computer.py

# 本作品采用MIT许可证授权。
# 版权所有 (c) 2013-2023 OpenMV LLC。保留所有权利。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 图像传输 - 作为远程设备
#
# 该脚本旨在与您计算机上的“image_transfer_jpg_as_the_controller_device.py”进行通信。
#
# 该脚本展示了如何将帧缓冲区作为jpeg图像传输到您的计算机。

import omv
import rpc
import sensor
import struct

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

# 从OpenMV Cam端关闭与IDE的帧缓冲区连接。
#
# 在手动压缩更高质量的jpeg图像时需要这样做
# 以便OpenMV Cam不会尝试使用回退方式将它们流式传输到IDE。
# 如果JPEG图像太大,无法放入OpenMV Cam的IDE JPEG帧缓冲区时的机制。

omv.disable_fb(True)

# 上述RPC库已安装在您的OpenMV Cam上,并提供了多个类,
# 允许通过USB或LAN/WLAN控制您的OpenMV Cam。

################################################################
# 选择您希望通过哪种接口控制您的OpenMV Cam。
################################################################

# 取消注释以下行以设置您的OpenMV Cam通过USB VCP进行控制。
#
interface = rpc.rpc_usb_vcp_slave()

# 取消注释以下行以设置您的OpenMV Cam通过局域网进行控制。
# 导入网络
#
# network_if = network.LAN()
# network_if.active(True)
# network_if.ifconfig('dhcp')
#
# interface = rpc.rpc_network_slave(network_if)

# 取消注释以下行以设置您的OpenMV Cam通过无线局域网进行控制。
#
# 导入网络
# network_if = network.WLAN(network.STA_IF)
# network_if.active(True)
# network_if.connect('您的SSID', '您的密码')
#
# interface = rpc.rpc_network_slave(network_if)

################################################################
# 回调
################################################################


# 调用时设置像素格式和帧大小,拍摄快照
# 然后返回帧缓冲区jpg大小以存储图像。
#
# data是像素格式字符串和帧大小字符串。
def jpeg_image_snapshot(data):
    pixformat, framesize = bytes(data).decode().split(",")
    sensor.set_pixformat(eval(pixformat))
    sensor.set_framesize(eval(framesize))
    img = sensor.snapshot()
    img.to_jpeg(quality=90)
    return struct.pack("<I", img.size())


def jpeg_image_read_cb():
    interface.put_bytes(sensor.get_fb().bytearray(), 5000)  # 超时


# 从帧缓冲区读取给定偏移和大小的数据。
# 如果数据为空,则在RPC调用完成后安排传输。
#
# 数据为4字节大小和4字节偏移。
def jpeg_image_read(data):
    if not len(data):
        interface.schedule_callback(jpeg_image_read_cb)
        return bytes()
    else:
        offset, size = struct.unpack("<II", data)
        return memoryview(sensor.get_fb().bytearray())[offset : offset + size]


# 注册回调。

interface.register_callback(jpeg_image_snapshot)
interface.register_callback(jpeg_image_read)

# 一旦所有回调都已注册,我们就可以开始
# 处理远程事件。interface.loop()不会返回。

interface.loop()

results matching ""

    No results matching ""