例程讲解34-image_transfer_raw_as_the_controller_device OpenMV作为主控设备传输原始图像

# 图像传输-作为主控设备
#
# 该脚本与另一个运行 "image_transfer_raw_as_the_remote_device.py" 的OpenMV Cam配对使用
#
# 这个脚本演示了如何将帧缓冲区从一个OpenMV Cam传输到另一个OpenMV Cam。

import image, network, omv, rpc, sensor, struct, time

# 上面的RPC库安装在您的OpenMV Cam上,并提供多种类,以允许您的OpenMV Cam控制CAN,I2C,SPI,UART或WIFI。

##############################################################
# 选择你想要控制的OpenMV摄像头的接口。
##############################################################

# 取消注释以下行以设置您的OpenMV Cam以控制CAN。
#
# * message_id - 用于CAN信息在can总线(11位)上进行数据传输。
# * bit_rate - CAN 比特率。
# * sampling_point - Tseg1/Tseg2 ratio. 一般为 75%. (50.0, 62.5, 75.0, 87.5, etc.)
#
# 注意:主从设备的message id和比特率必须匹配。将主设备的高电平引脚连接到从设备的高电平引脚,
# 将主设备的低电平引脚连接到从设备的低电平引脚。CAN总线必须接120欧姆的终端电阻。
#
# interface = rpc.rpc_can_master(message_id=0x7FF, bit_rate=1000000, sampling_point=75.0)

# 取消注释以下行以设置您的OpenMV Cam以控制I2C。
#
# * slave_addr - I2C地址。
# * rate - I2C总线时钟频率。
#
# 注意:主地址和从地址必须匹配。将主scl连接到从scl,将主sda连接到从sda。
# 您必须使用外部上拉电阻。最后,两个设备必须共地。
#
# interface = rpc.rpc_i2c_master(slave_addr=0x12, rate=1000000)

# 取消注释以下行以设置您的OpenMV Cam以控制SPI。
#
# * cs_pin - 从片选引脚。
# * freq - SPI总线时钟频率。
# * clk_polarity - 空闲时钟电平(0或1)。
# * clk_phase — 在时钟的第一个(0)或第二个边沿(1)上采样数据。
#
# 注意:主机和从机设置必须匹配。将CS,SCLK,MOSI,MISO连接到CS,SCLK,MOSI,MISO。
# 最后,两个设备必须共地。
#
interface = rpc.rpc_spi_master(cs_pin="P3", freq=20000000, clk_polarity=1, clk_phase=0)

# 取消注释以下行以设置您的OpenMV Cam以控制UART。
#
# * baudrate - 串行波特率。
#
# 注意:主和从波特率必须匹配。将主TX连接到从TX,将主TX连接到从TX。
# 最后,两个设备必须共地。
#
# interface = rpc.rpc_uart_master(baudrate=7500000)

##############################################################
# 回调处理程序
##############################################################

def get_frame_buffer_call_back(pixformat, framesize, cutthrough, silent):
    if not silent: print("Getting Remote Frame...")

    result = interface.call("raw_image_snapshot", struct.pack("<II", pixformat, framesize))
    if result is not None:

        w, h, pixformat, size = struct.unpack("<IIII", result)
        img = image.Image(w, h, pixformat, copy_to_fb=True) # 清除帧缓冲区。

        if cutthrough:
            # 快速直通数据传输,无错误检查。

            # 在开始直通数据传输之前,我们需要同步主设备和从设备。
            # 返回时,两个设备都同步。
            result = interface.call("raw_image_read")
            if result is not None:

                # GET BYTES NEEDS TO EXECUTE NEXT IMMEDIATELY WITH LITTLE DELAY NEXT.

                # 在一个非常大的传输中读取所有的图像数据。
                interface.get_bytes(img.bytearray(), 5000) # 超时

        else:
            # 带有错误检查的较慢的数据传输。

            # Transfer 32/8 KB chunks.
            chunk_size = (1 << 15) if omv.board_type() == "H7" else (1 << 13)

            if not silent: print("Reading %d bytes..." % size)
            for i in range(0, size, chunk_size):
                ok = False
                for j in range(3): # 最多尝试3次。
                    result = interface.call("raw_image_read", struct.pack("<II", i, chunk_size))
                    if result is not None:
                        img.bytearray()[i:i+chunk_size] = result # 写入图像数据。
                        if not silent: print("%.2f%%" % ((i * 100) / size))
                        ok = True
                        break
                    if not silent: print("Retrying... %d/2" % (j + 1))
                if not ok:
                    if not silent: print("Error!")
                    return None

        return img

    else:
        if not silent: print("Failed to get Remote Frame!")

    return None

clock = time.clock()
while(True):
    clock.tick()

    # 您可以通过修改以下参数来更改从远程设备传输的图像的像素格式和帧大小。
    #
    # 如果cutthrough为False,则图像将通过带有CRC的RPC库进行传输,并对所有移动的数据重试保护。
    # 为了更快的数据传输,请将cutthrough设置为True,以便在RPC调用完成后将get_bytes()和put_bytes()调用,
    # 从而将数据从一个图像缓冲区更快速地传输到另一个。
    # 注意:之所以可行,是因为RPC调用成功完成后,主设备和从设备都将完全同步。
    #
    img = get_frame_buffer_call_back(sensor.RGB565, sensor.QQVGA, cutthrough=True, silent=True)
    if img is not None:
        pass # 您可以在这里处理图像。

    print(clock.fps())

results matching ""

    No results matching ""