Spiegazione della routine 34-immagine_trasferimento_raw_come_il_remoto_dispositivo OpenMV trasferisce l'immagine originale come dispositivo controllato
# 图像传输-作为受控设备
#
# 该脚本与另一个运行 "image_transfer_raw_as_the_controller_device.py" 的OpenMV Cam配对使用
#
# 这个脚本演示了如何将帧缓冲区从一个OpenMV Cam传输到另一个OpenMV Cam。
import image, network, rpc, sensor, struct
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
# 上面的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_slave(message_id=0x7FF, bit_rate=1000000, sampling_point=75.0)
# 取消注释以下行以设置您的OpenMV Cam以控制I2C。
#
# * slave_addr - I2C地址。
#
# 注意:主地址和从地址必须匹配。将主scl连接到从scl,将主sda连接到从sda。
# 您必须使用外部上拉电阻。最后,两个设备必须共地。
#
# interface = rpc.rpc_i2c_slave(slave_addr=0x12)
# 取消注释以下行以设置您的OpenMV Cam以控制SPI。
#
# * cs_pin - 从片选引脚。
# * clk_polarity - 空闲时钟电平(0或1)。
# * clk_phase — 在时钟的第一个(0)或第二个边沿(1)上采样数据。
#
# 注意:主机和从机设置必须匹配。将CS,SCLK,MOSI,MISO连接到CS,SCLK,MOSI,MISO。
# 最后,两个设备必须共地。
#
interface = rpc.rpc_spi_slave(cs_pin="P3", clk_polarity=1, clk_phase=0)
# 取消注释以下行以设置您的OpenMV Cam以控制UART。
#
# * baudrate - 串行波特率。
#
# 注意:主和从波特率必须匹配。将主TX连接到从TX,将主TX连接到从TX。
# 最后,两个设备必须共地。
#
# interface = rpc.rpc_uart_slave(baudrate=7500000)
################################################################
# 回调
################################################################
# 调用时设置像素格式和帧大小,拍摄快照,然后返回帧缓冲区形状以将图像存储在其中。
#
# data是4字节的像素格式和4字节的帧大小。
def raw_image_snapshot(data):
pixformat, framesize = struct.unpack("<II", data)
sensor.set_pixformat(pixformat)
sensor.set_framesize(framesize)
img = sensor.snapshot()
return struct.pack("<IIII", sensor.width(), sensor.height(), sensor.get_pixformat(), img.size())
def raw_image_read_cb():
interface.put_bytes(sensor.get_fb().bytearray(), 5000) # 超时
# 从给定偏移量和大小的帧缓冲区中读取数据。
# 如果数据为空,则在RPC调用完成后安排传输。
#
# data是4字节大小和4字节偏移量。
def raw_image_read(data):
if not len(data):
interface.schedule_callback(raw_image_read_cb)
return bytes()
else:
offset, size = struct.unpack("<II", data)
return memoryview(sensor.get_fb().bytearray())[offset:offset+size]
# 添加回调。
interface.register_callback(raw_image_snapshot)
interface.register_callback(raw_image_read)
# 一旦所有的回调都被添加,我们就可以开始处理远程事件。
# loop()不返回。
interface.loop()