基于OPENMV实现一个单目测速测试

1、测试平台:OpenMV4H7Plus开发板​

        

     

        使用的相机是 MT9V034 相机对应为752x480黑白图像,为全局快门

 2、测速的时候,仅选取最大物体的抓取,这里采用了几个步骤:

        ①、直接计算灰度的帧差

        ②、对帧差进行阈值处理以获取motion mask

        ③、绘制出motion mask的轮廓和边界

        ④、通过与上一帧的坐标位置计算移动的像素速度(可以计算中心的坐标或者边界坐标(当物体过大不在整个相机的视野中有用),这里简单的延时中心坐标)

import sensor, image, time, math# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)  # 设置为灰度模式
sensor.set_framesize(sensor.QVGA)       # 设置帧大小
sensor.skip_frames(time = 2000)         # 跳过前2秒的帧# 初始化定时器
clock = time.clock()# 捕获若干帧用于计算背景帧(将捕获的图像与当前的背景帧进行混合,更新背景帧)
background_frame = sensor.snapshot().copy()
num_background_frames = 50  # 捕获50帧用于背景计算for i in range(num_background_frames):img = sensor.snapshot()background_frame = background_frame.blend(img, alpha=128)# 初始化前一帧的位置为None
previous_blob = None
previous_time = Nonewhile(True):clock.tick()# 捕获当前帧current_frame = sensor.snapshot()# 计算当前帧和背景帧的灰度差frame_difference = current_frame.difference(background_frame)# 对帧差进行阈值处理,生成运动掩码motion_mask = frame_difference.binary([(50, 255)])  # 阈值设置为50# 查找运动掩码中的轮廓blobs = motion_mask.find_blobs([(50, 255)], pixels_threshold=100, area_threshold=100, merge=True)# 如果找到轮廓,查找最大的轮廓if blobs:largest_blob = max(blobs, key=lambda b: b.pixels())# 获取边界框x, y, w, h = largest_blob.rect()# 在当前帧上绘制边界框current_frame.draw_rectangle(x, y, w, h)print(f"x: {x}, y: {y}")# 绘制中心点current_frame.draw_cross(largest_blob.cx(), largest_blob.cy())# 计算边框移动速度current_time = time.ticks_ms()if previous_blob and previous_time:dx = largest_blob.cx() - previous_blob.cx()dy = largest_blob.cy() - previous_blob.cy()dt = time.ticks_diff(current_time, previous_time) / 1000.0  # 时间差转换为秒# 计算x和y方向的速度speed_x = dx / dt  # x方向速度,单位为像素/秒speed_y = dy / dt  # y方向速度,单位为像素/秒print("Speed X: %.2f pixels/sec" % speed_x)print("Speed Y: %.2f pixels/sec" % speed_y)# 更新前一帧的位置和时间previous_blob = largest_blobprevious_time = current_time# 显示FPSprint(clock.fps())

如图所示可以清楚的抓取到目标的边框可以计算出像素位移 

注意:

        1、此算法没有加入滤波算法,请自行添加卡尔曼滤波等算法。 

        2、次算法仅在开始抓取的时候获取了背景图像,因此建议加入动态背景更新的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码随想录训练营第42期 Day7打卡 LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

目录 一、做题心得 二、题目及题解 454.四数相加II 题目链接 题解 383. 赎金信 题目链接 题解 15. 三数之和 题目链接 题解 18. 四数之和 题目链接 题解 三、小结 一、做题心得 今天是代码随想录训练营打卡的第七天,做的也是同昨天一样的哈希表部分…

CUDA编程之grid和block详解

CUDA 文章目录 CUDAgrid和block基本的理解1维 遍历2维 遍历3维 遍历3维 打印对应的thread grid和block基本的理解 Kernel:Kernel不是CPU,而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机(CPU)调…

使用Chainlit接入通义千问快速实现一个多模态的对话应用

开通灵识服务 首先需要到阿里云-模型服务灵积开通账户,获得apiKey 模型服务灵积 https://dashscope.aliyun.com/ 进入控制台 ,在API-KEY管理里,创建一个新的API-KEY,然后保存起来,后面会用到。 模型服务灵积服务所有API文档地址…

数据结构:构建数字世界的基石

在数字化时代,数据已成为推动社会进步与经济发展的核心驱动力。而数据结构,作为计算机科学的基础与核心,是存储、组织和管理这些海量数据的基石。无论是简单的应用程序还是复杂的系统架构,都离不开高效、灵活的数据结构支持。本文…

KUKA机器人外部自动IO信号经验分享

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

k8s学习--k8s集群部署kubesphere的详细过程

文章目录 kubesphere简介k8s群集部署kubespere环境准备工作一、配置nfs二、配置storageclass三、kubesphere开启服务(devops) kubesphere简介 下面是官方文档描述 KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多…

【python】最新版抖音js逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

如何压缩pdf文件大小?这5种方法,简单又实用!

如何压缩pdf文件大小?pdf是电脑常用的便携式文档格式,无论是在学术领域的论文发表,还是在商业场景中的合同签署,甚至是个人简历的提交,PDF文件都扮演着重要的角色。 电脑上存储pdf文件会面临一个难题,那就是…

收不到验证码邮件怎么办?快速排查与解决!

收不到验证码邮件有哪些应对策略?验证码邮件被拦截? 经常需要通过邮箱接收验证码邮件来完成各种操作。然而,许多人都会遇到收不到验证码邮件的情况。AokSend将详细介绍如何快速排查和解决收不到验证码邮件的问题。 收不到验证码邮件&#x…

Vue 项目部署后首页白屏问题排查与解决

引言 在部署 Vue.js 项目时,有时会遇到首页加载后出现白屏的情况,这可能是由于多种原因造成的。本文将介绍一些常见的排查方法和解决方案,帮助开发者快速定位问题并解决。 1. 常见原因分析 首页白屏的问题可能由以下几个方面的原因导致&am…

深入探索CSS3的Media Query:打造响应式网页设计的利器

在今天的互联网世界中,随着设备种类和屏幕尺寸的多样化,响应式网页设计(Responsive Web Design, RWD)已成为不可或缺的一部分。CSS3中的Media Query正是这一设计理念的实现利器,它允许开发者根据用户的设备特性和屏幕尺…

C++ 模板初级

引入 在讲函数模板之前就要先讲讲函数重载了 #include <iostream> using namespace std;int add(int a, int b) {return a b; }double add(double a, double b) {return a b; }int main() {cout << add(2, 3) << endl; cout << add(2.5, 3.7)…

pake 打包TodoList windows桌面应用exe

参考&#xff1a; rust安装 https://blog.csdn.net/weixin_42357472/article/details/125943880 pake网址 https://github.com/tw93/Pake 支持把网页打包成多终端应用 离线网站打包参考&#xff1a; https://github.com/tw93/Pake/wiki/Pake%E6%89%93%E5%8C%85%E9%9D%99%E6%8…

uniapp 小程序内嵌H5链接返回到小程序(亲测)

使用 weixin-js-sdk&#xff0c;特别注意的是&#xff0c;在vue项目中之前安装过 weixin-js-sdk 的&#xff0c;一定要要跟新&#xff0c;但是好像只可以更新到1.6.0版本&#xff0c;而微信要求最低版本是1.6.4&#xff0c;不过不影响使用。 安装weixin-js-sdk npm install w…

Unity Transform组件实现动画:基础与进阶技巧

在Unity中&#xff0c;Transform组件是控制游戏对象&#xff08;GameObject&#xff09;位置、旋转和缩放的核心组件。通过编程控制Transform组件&#xff0c;开发者可以创建各种动画效果。本文将介绍如何使用Transform组件实现动画&#xff0c;从基础的运动到更高级的动画技巧…

企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台

文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…

Lambda和Stream让代码简洁的七大原则

1. Lambda优于匿名内部类 函数接口&#xff1a;JDK 8中&#xff0c;只存在一个抽象方法的接口称为函数接口&#xff0c;使用FunctionalInterface注解标识。示例&#xff1a;FunctionalInterface public interface Comparator<T> {int compare(T o1, T o2); }Lambda表达式…

深入解读:几种常见视频大模型原理对比分析

在人工智能的快速发展中&#xff0c;视频分析技术逐渐成为研究的热点。伴随着深度学习的崛起&#xff0c;各种视频大模型应运而生&#xff0c;广泛应用于视频理解、动作识别、视频生成等领域。本文将对几种常见的视频大模型进行原理对比分析&#xff0c;帮助读者更好地理解它们…

JDK、JRE、JVM的区别

总结&#xff1a; JDK为开发人员提供了完整的开发和运行Java程序所需的工具和库&#xff0c;包括JRE、编译器&#xff08;javac&#xff09;、调试器&#xff08;jdb&#xff09;、Java类库&#xff08;如java标准库&#xff09;、基本开发工具&#xff1b; JRE为普通用户或需…