用Python替代OpenMV IDE显示openmv USB 图像
原理是利用openmv的usb模仿串口,然后用Python代码打开串口接收
能替代openmv ide 跑48帧图像
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端代码:
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端代码:
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
相关文章:

用Python替代OpenMV IDE显示openmv USB 图像
原理是利用openmv的usb模仿串口,然后用Python代码打开串口接收 能替代openmv ide 跑48帧图像 Python端需要的依赖: 需要的是: from ultralytics import YOLO import cv2 import numpy as np from serial import Serial import time from co…...

c语言:编译和链接(详解)
前言 要将编译和链接,就不得不提及编译器是如何运作的,虽然这部分知识是针对于要创造编译器和创作语言的人所需要清楚的,但作为c语言的学习者也需要了解一下,修炼内功,尤其是对于想学习c的人而言。 编译器的运作过程…...
数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)
单链表操作的C/C实现详解 在数据结构中,单链表是一种非常基础且重要的数据结构。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C实现的单链表及其各种操作。 一、单链表的定义 const int N 1e5; //单链表 t…...

leetcode27.删除有序数组中的重复项
目录 问题描述判题标准示例提示 具体思路思路一思路二 代码实现 问题描述 给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致 。然后返回nums中唯一元…...

[c语言日寄]越界访问:意外的死循环
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

【c++11】包装器
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 包装器(Wrapper) 是一个常见的编程设计模式,通常用于封装或“包装”某个现有的对象、函数、数据结构或者操作,以提供额外的功能或简化接口。…...
信息学奥赛一本通 1422:【例题1】活动安排
【题目链接】 ybt 1422:【例题1】活动安排 【题目考点】 1. 贪心 【解题思路】 该题属于区间选点问题,ybt 1324:【例6.6】整数区间 是给定一些区间,选择一些点使得每个区间范围内至少有1个点。 本题为:给定一些区…...

数据库、数据仓库、数据湖有什么不同
数据库、数据仓库和数据湖是三种不同的数据存储和管理技术,它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别: 1. 数据结构与存储方式 数据库: 数据库主要用于存储结构化的数据&…...
llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3
llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3 1. LLAMA_VOCAB_PRE_TYPE_DEEPSEEK3_LLM2. static const std::map<std::string, llm_chat_template> LLM_CHAT_TEMPLATES3. LLM_CHAT_TEMPLATE_DEEPSEEK_3References 不宜吹捧中国大语言模型的同时,又去贬低美国大语言…...
深度学习的应用场景及常用技术
深度学习作为机器学习的一个重要分支,在众多领域都有广泛的应用,以下是一些主要的应用场景及常用技术。 1.应用场景 1. 计算机视觉 图像分类 描述:对图像中的内容进行分类,识别出图像中物体所属的类别。例如,在安防领…...

小程序项目-购物-首页与准备
前言 这一节讲一个购物项目 1. 项目介绍与项目文档 我们这里可以打开一个网址 https://applet-base-api-t.itheima.net/docs-uni-shop/index.htm 就可以查看对应的文档 2. 配置uni-app的开发环境 可以先打开这个的官网 https://uniapp.dcloud.net.cn/ 使用这个就可以发布到…...
网件r7000刷回原厂固件合集测评
《网件R7000路由器刷回原厂固件详解》 网件R7000是一款备受赞誉的高性能无线路由器,其强大的性能和可定制性吸引了许多高级用户。然而,有时候用户可能会尝试第三方固件以提升功能或优化网络性能,但这也可能导致一些问题,如系统不…...

微信登录模块封装
文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器
一、高级定时器简介 高级定时器的简介在前面一章已经介绍过,可以点击下面链接了解,在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数,还独有一个重复计…...

后台管理系统通用页面抽离=>高阶组件+配置文件+hooks
目录结构 配置文件和通用页面组件 content.config.ts const contentConfig {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px&q…...
8.原型模式(Prototype)
动机 在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多&#…...
Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具(专业版)
前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…...
13 尺寸结构模块(size.rs)
一、size.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…...

STM32单片机学习记录(2.2)
一、STM32 13.1 - PWR简介 1. PWR(Power Control)电源控制 (1)PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能; (2)可编程电压监测器(…...
CSS 样式化表格:从基础到高级技巧
CSS 样式化表格:从基础到高级技巧 1. 典型的 HTML 表格结构2. 为表格添加样式2.1 间距和布局2.2 简单的排版2.3 图形和颜色2.4 斑马条纹2.5 样式化标题 3. 完整的示例代码4. 总结 在网页设计中,表格是展示数据的常见方式。然而,默认的表格样式…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...