用Python替代OpenMV IDE显示openmv USB 图像

devtools/2025/2/5 0:20:39/

原理是利用openmv的usb模仿串口,然后用Python代码打开串口接收

能替代openmv ide 跑48帧图像

Python端需要的依赖:

python">需要的是:
from ultralytics import YOLO
import cv2
import numpy as np
from serial import Serial
import time
from collections import deque

pyserial              3.5

numpy                 2.0.2

ultralytics           8.3.67 

opencv-contrib-python 4.11.0.86
opencv-python         4.11.0.86

Python端代码:

python">from ultralytics import YOLO
import cv2
import numpy as np
from serial import Serial
import time
from collections import deque# 配置参数
SERIAL_PORT = 'COM25'  # 串口号(Windows)
BAUD_RATE = 1  # 波特率
HEADER = b'\xAA\x55\xAA\x55'  # 帧头
HEADER_LEN = len(HEADER)  # 帧头长度
FPS_WINDOW_SIZE = 30  # 计算FPS的窗口大小(帧数)# 初始化YOLO模型
model = YOLO('yolov8n.pt')  # 确认模型路径正确# 性能统计变量
fps_queue = deque(maxlen=FPS_WINDOW_SIZE)  # 存储时间戳用于计算FPS
serial_read_time = 0.0  # 串口读取耗时
inference_time = 0.0  # 推理耗时def find_header(ser):"""同步数据流,找到帧头位置"""buffer = bytearray()while True:byte = ser.read(1)if not byte:continuebuffer += byteif len(buffer) >= HEADER_LEN and buffer[-HEADER_LEN:] == HEADER:returnelif len(buffer) > 100:buffer.clear()def draw_stats(img, fps, srt, inf_t):"""在图像上绘制性能统计信息"""cv2.putText(img, f"FPS: {fps:.1f}", (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)cv2.putText(img, f"Serial: {srt:.1f}ms", (10, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 1)cv2.putText(img, f"Inference: {inf_t:.1f}ms", (10, 90),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 1)return imgtry:ser = Serial(SERIAL_PORT, BAUD_RATE, timeout=0.1)print(f"Connected to {SERIAL_PORT}")while True:frame_start = time.perf_counter()# 步骤1:同步到帧头find_header(ser)# 步骤2:读取图像大小size_bytes = ser.read(4)if len(size_bytes) != 4:continue# 步骤3:读取图像数据size = int.from_bytes(size_bytes, 'little')img_bytes = bytearray()read_start = time.perf_counter()while len(img_bytes) < size:remaining = size - len(img_bytes)img_bytes += ser.read(remaining)serial_read_time = (time.perf_counter() - read_start) * 1000  # ms# 解码图像decode_start = time.perf_counter()img = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_COLOR)if img is None:continue# YOLO推理inference_start = time.perf_counter()# results = model(img, show=False, verbose=False)  # 关闭冗余输出inference_time = (time.perf_counter() - inference_start) * 1000  # ms# 计算FPSfps_queue.append(frame_start)if len(fps_queue) > 1:fps = len(fps_queue) / (fps_queue[-1] - fps_queue[0])else:fps = 0# 绘制统计信息# annotated_img = results[0].plot()annotated_img = draw_stats(img, fps, serial_read_time, inference_time)# 显示结果cv2.imshow('YOLO Detection', annotated_img)# 退出检测if cv2.waitKey(1) & 0xFF == ord('q'):breakexcept KeyboardInterrupt:print("User interrupted.")
except Exception as e:print(f"Error: {e}")
finally:ser.close()cv2.destroyAllWindows()print("Resources released.")

把openmv代码作为main放到openmv里然后断开连接重新连接,并且一定要保证openmv  ide连不到openmv

openmv端代码:

python">import sensor, image, time, pyb# 摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.JPEG)    # 设置JPEG压缩模式
sensor.set_framesize(sensor.QVGA)    # 分辨率320x240(可调整)
sensor.set_quality(80)               # 压缩质量(0-100,越高越清晰)
sensor.skip_frames(time=2000)        # 等待摄像头稳定usb = pyb.USB_VCP()                  # USB虚拟串口对象
HEADER = b'\xAA\x55\xAA\x55'         # 帧头标识(4字节)while True:try:img = sensor.snapshot()img_bytes = img.bytearray()  # 获取JPEG图像字节流# 发送数据包格式:[帧头(4字节) + 图像大小(4字节) + 图像数据]usb.write(HEADER)                            # 1. 发送帧头usb.write(len(img_bytes).to_bytes(4, 'little'))  # 2. 发送图像大小(小端序)usb.write(img_bytes)                         # 3. 发送图像数据time.sleep_ms(1)  # 控制帧率(约20FPS,根据实际调整)except Exception as e:print("OpenMV Error:", e)break


http://www.ppmy.cn/devtools/156127.html

相关文章

Immutable设计 SimpleDateFormat DateTimeFormatter

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 理解不可变设计模式&#xff0c;时间format有线程安全要求的注意使用DateTimeFormatter 目录 ImmutableSimpleDateFormat 非线程安全可以synchronized解决&a…

人机交互系统实验三 多通道用户界面

实验目的和要求 1)了解常见的多通道用户界面 2)查找资料&#xff0c;熟悉一种多通道用户界面并写出综述 实验环境 Windows10 实验内容与过程 (一) 实验内容: 要求上网查找资料&#xff0c;熟悉一种多通道用户界面并写出综述&#xff0c;可以是眼动跟踪、手势识别、 三维…

论文阅读(七):贝叶斯因果表型网络解释遗传变异和生物学知识

1.论文链接&#xff1a;Bayesian Causal Phenotype Network Incorporating Genetic Variation and Biological Knowledge 摘要&#xff1a; 在分离群体中&#xff0c;数量性状基因座&#xff08;QTL&#xff09;定位可以确定对表型有因果效应的QTL。这些方法的一个共同特点是Q…

初始Linux(7):认识进程(下)

1. 进程优先级 cpu 资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08; priority &#xff09;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用&#xff0c;可以改善系统性能。 还可以把进程运行到指定的CPU 上&#xff0c;这样一来…

Spring Boot基本项目结构

要写一个Spring Boot 项目对于新手小白来说&#xff0c;首先要了解Spring Boot 的基本架构&#xff0c;学会如何创建一个简单的spring boot项目。 springboot 基于maven做的&#xff08;前提保证maven是装好并且IDEA配置好的&#xff09;&#xff08;面向接口编程&#xff09;…

【Linux】解决 apt-key 弃用问题:GPG 直接管理密钥代替 apt-key

引言 在 Linux 系统&#xff0c;尤其是 Debian 和 Ubuntu 中&#xff0c;APT&#xff08;Advanced Package Tool&#xff09;是广泛使用的包管理工具&#xff0c;负责安装、更新和管理系统软件包。历史上&#xff0c;apt-key 命令一直被用来管理 GPG 密钥&#xff0c;验证软件…

matlab中,fill命令用法

在 MATLAB 中&#xff0c;fill 命令用于创建填充多边形的图形对象。使用 fill 可以在二维坐标系中绘制填充的区域&#xff0c;通常用于绘制图形的背景或显示数据分布。 基本语法 fill(X, Y, C)X 和 Y 是同样长度的向量&#xff0c;定义了多边形的顶点坐标。C 是颜色&#xff0…

FreeRTOS学习笔记2:FreeRTOS的基础知识

1.FreeRTOS介绍 FreeRTOS是一个免费的嵌入式实时操作系统&#xff0c;同时它在市面上也是一款主流的操作系统&#xff0c;是工作上必不可少的技能。它具有以下六种特点&#xff1a; 1.免费开源&#xff1a;在商业产品中使用&#xff0c;无潜在商业风险&#xff0c;无需担心。 2…