当前位置: 首页 > news >正文

基于OpenMV的智能小车图像识别与跟踪系统设计

一、项目概述

目标和用途

本项目旨在设计一款智能三轮车,通过图像识别技术实现对特定颜色小球的自动跟踪。该系统具有实时性和高精度的特点,适用于教育机器人、智能监控及自动导航等多个领域。通过采用OpenMV模块,结合STM32单片机的强大处理能力,能够实现简单而有效的目标跟踪功能。

技术栈关键词

  • 硬件:STM32F765VI单片机、OV7725图像传感器、L298N电机驱动模块

  • 软件:OpenMV IDE、STM32CubeIDE、图像处理算法库

  • 算法:灰度处理、滤波、二值化、形态学处理(膨胀与腐蚀)、PID控制算法

二、系统架构

系统架构设计

本系统架构由多个模块组成,包括图像采集、图像处理、运动控制和电机驱动。具体设计如下:

  1. 图像采集模块:使用OV7725传感器定期获取环境图像。

  2. 图像处理模块:基于OpenMV平台,利用图像处理算法对采集到的图像进行分析,以识别目标小球。

  3. 运动控制模块:利用STM32F765VI单片机的运算能力,对电机进行控制,执行跟踪行为。

选择的单片机和通信协议

  • 单片机:选择STM32F765VI作为主控芯片,它具有高性能的Cortex-M7内核,适合复杂的控制任务。

  • 通信协议:采用UART进行OpenMV与STM32之间的数据交换,确保数据传输的实时性和可靠性。

系统架构图

获取图像
识别小球
控制电机
反馈信息
图像采集模块
图像处理模块
控制模块
运动模块

三、环境搭建和注意事项

环境搭建

  1. 硬件准备:

    • STM32F765VI开发板:作为系统的核心控制单元。

    • OV7725图像传感器:用于实时图像采集。

    • L298N电机驱动模块:用于控制直流电机的运动。

    • 直流电机及电源模块:为运动系统提供驱动力。

    • 跳线和面包板:用于连接各个模块。

  2. 软件准备:

    • OpenMV IDE:用于图像处理和算法实现。

    • STM32CubeIDE:用于STM32的开发和调试。

注意事项

  • 电源管理:确保各模块供电电压和电流符合规格,避免损坏。

  • 光照条件:在不同光照条件下测试系统,确保小球识别的鲁棒性。

  • 调试过程:在调试时仔细检查连接线,避免短路和接触不良,确保系统稳定运行。

四、代码实现过程

在本节中,我们将详细介绍基于OpenMV的图像识别与跟踪系统的代码实现过程。我们将分模块进行说明,包括图像采集、图像处理、运动控制等功能模块。每个模块的代码示例将附带详细的说明,以确保逻辑的清晰性和可维护性。

1. 图像采集模块

图像采集模块的关键任务是通过OV7725传感器实时捕获环境图像。以下是该模块的代码实现:

import sensor
import image
import time# 初始化传感器
sensor.reset()  # 重置图像传感器
sensor.set_pixformat(sensor.RGB565)  # 设置图像格式为RGB565
sensor.set_framesize(sensor.QVGA)  # 设置图像分辨率为320x240
sensor.skip_frames(time=2000)  # 跳过前几帧,以使图像稳定while True:img = sensor.snapshot()  # 捕获单帧图像img = img.to_grayscale()  # 转换为灰度图像,以简化后续处理# 继续处理图像
代码说明:
  • sensor.reset():初始化图像传感器,清空之前的设置。

  • sensor.set_pixformat(sensor.RGB565):设置图像的颜色格式为RGB565,这是常用的色彩模式,适合于图像处理。

  • sensor.set_framesize(sensor.QVGA):设置图像分辨率为320x240像素(QVGA),这是一个较低的分辨率,便于实时处理。

  • sensor.skip_frames(time=2000):在启动后跳过前2秒的帧,以确保图像传感器在稳定状态下工作。

  • sensor.snapshot():捕获当前帧的图像。

  • img.to_grayscale():将捕获的图像转换为灰度图像,以减少计算负担并提高后续图像处理的速度。

2. 图像处理模块

在图像处理模块中,我们使用图像处理算法识别特定颜色的小球。以下是该模块的代码实现:

def find_ball(img):# 使用颜色阈值查找特定的颜色(例如黄色)# 颜色范围可根据实际需要调整blobs = img.find_blobs([(30, 100, -64, 127, -128, 127)], pixels_threshold=200)  # 查找小球if blobs:  # 如果检测到blob# 找到面积最大的blobblob = max(blobs, key=lambda b: b.pixels())img.draw_rectangle(blob.rect())  # 在图像上绘制矩形框img.draw_cross(blob.cx(), blob.cy())  # 在小球中心绘制十字标记return blob  # 返回检测到的blobreturn None  # 如果没有检测到blob,返回None
代码说明:
  • find_ball(img):定义一个函数,接收图像作为参数并返回检测到的小球信息。

  • img.find_blobs(…):使用颜色阈值查找图像中的blob。颜色范围是以HSV颜色空间中的值定义的,具体参数根据所需颜色进行调整。

  • 阈值说明:(30, 100, -64, 127, -128, 127)表示寻找特定颜色的范围。

  • if blobs:检查是否检测到blob。

  • max(blobs, key=lambda b: b.pixels()):找到面积最大的blob,确保选择最大的小球,以提高识别的准确性。

  • img.draw_rectangle(blob.rect()):在图像上绘制检测到的小球的外接矩形,以便于可视化。

  • img.draw_cross(blob.cx(), blob.cy()):在blob的中心位置绘制十字形标记,便于确认小球的位置。

  • return blob:返回检测到的小球的信息(如位置和大小)。

  • return None:如果没有检测到小球,返回None。

3. 控制模块

控制模块的任务是根据识别到的小球位置,调整小车的运动方向。以下是控制模块的代码实现示例:

# PID控制参数
Kp = 0.5  # 比例增益
Kd = 0.2  # 微分增益def pid_control(target_x, current_x, last_error):"""PID控制算法实现:param target_x: 目标小球的x坐标:param current_x: 当前小车的x坐标:param last_error: 上一控制周期的误差:return: 控制信号和当前误差"""error = target_x - current_x  # 计算误差control_signal = Kp * error + Kd * (error - last_error)  # 计算控制信号return control_signal, error  # 返回控制信号及当前误差
代码说明:
  • pid_control(target_x, current_x, last_error):定义一个PID控制函数,接收目标小球的x坐标、当前小车的x坐标和上一控制周期的误差作为参数。

  • error = target_x - current_x:计算当前误差,目标位置与当前车辆位置的差。

  • control_signal = Kp * error + Kd * (error - last_error):计算控制信号,采用比例和微分的组合方式。比例增益(Kp)控制误差的快速响应,而微分增益(Kd)用于预测未来的误差变化。

  • return control_signal, error:返回计算得到的控制信号和当前误差,供后续运动控制使用。

4. 运动控制模块

运动控制模块使用L298N电机驱动模块控制小车的运动。以下是该模块的代码实现示例:

from pyb import UART, Pin# 初始化电机控制引脚
motor_left_forward = Pin('P0', Pin.OUT)  # 左电机正转
motor_left_backward = Pin('P1', Pin.OUT)  # 左电机反转
motor_right_forward = Pin('P2', Pin.OUT)  # 右电机正转
motor_right_backward = Pin('P3', Pin.OUT)  # 右电机反转def move_car(control_signal):"""根据控制信号移动小车:param control_signal: 控制信号"""if control_signal > 0:  # 如果控制信号为正motor_left_forward.high()  # 左电机正转motor_left_backward.low()  # 左电机停止反转motor_right_forward.high()  # 右电机正转motor_right_backward.low()  # 右电机停止反转elif control_signal < 0:  # 如果控制信号为负motor_left_forward.low()  # 左电机停止正转motor_left_backward.high()  # 左电机反转motor_right_forward.low()  # 右电机停止正转motor_right_backward.high()  # 右电机反转else:  # 如果控制信号为0motor_left_forward.low()  # 停止左电机motor_left_backward.low()  # 停止左电机motor_right_forward.low()  # 停止右电机motor_right_backward.low()  # 停止右电机
代码说明:
  • motor_left_forward = Pin(‘P0’, Pin.OUT):初始化左电机正转引脚P0为输出模式。

  • motor_left_backward = Pin(‘P1’, Pin.OUT):初始化左电机反转引脚P1为输出模式。

  • motor_right_forward = Pin(‘P2’, Pin.OUT):初始化右电机正转引脚P2为输出模式。

  • motor_right_backward = Pin(‘P3’, Pin.OUT):初始化右电机反转引脚P3为输出模式。

  • move_car(control_signal):根据控制信号控制小车的运动。

  • if control_signal > 0:如果控制信号为正,表示小车需要向前移动,控制左右电机正转。

  • elif control_signal < 0:如果控制信号为负,表示小车需要向后移动,控制左右电机反转。

  • else:如果控制信号为0,停止所有电机。

5. 主循环

最后,我们需要将所有模块整合到一个主循环中,以实现实时的图像采集、处理以及控制小车的功能。以下是主循环的代码实现:

import time# 初始化UART通信
uart = UART(3, 115200)  # 初始化UART3,波特率115200last_error = 0  # 上一控制周期的误差初始化while True:img = sensor.snapshot()  # 捕获当前图像ball = find_ball(img)  # 查找小球if ball:  # 如果检测到小球# 获取小球的中心坐标ball_x = ball.cx()  # 获取小球中心的x坐标# 计算当前小车的位置current_x = 160  # 小车位置假设为图像中心(320/2)# 计算控制信号control_signal, last_error = pid_control(ball_x, current_x, last_error)# 控制小车的运动move_car(control_signal)# 发送小球坐标信息到上位机(可选)uart.write("Ball Position: {}\n".format(ball_x))else:# 如果没有检测到小球,停止小车move_car(0)time.sleep(0.1)  # 适当延时,避免处理过快
代码说明:
  • import time:导入时间模块,用于控制循环的延时。

  • uart = UART(3, 115200):初始化UART3,设置波特率为115200,用于通信(如需要)。

  • last_error = 0:初始化上一个控制周期的误差为0,以便在PID控制中使用。

  • while True:开始主循环,持续执行以下步骤。

  • ball_x = ball.cx():获取小球的x坐标。

  • current_x = 160:假设小车的位置为图像的中心(320/2),以便进行PID控制。

  • control_signal, last_error = pid_control(ball_x, current_x, last_error):调用PID控制算法,计算控制信号并更新误差。

  • move_car(control_signal):根据控制信号调整小车的运动方向。

  • uart.write(“Ball Position: {}\n”.format(ball_x)):将小球位置数据发送到上位机(可选),用于监控或调试。

  • img = sensor.snapshot():获取当前图像帧。

  • ball = find_ball(img):调用图像处理函数,查找图像中的小球。

  • if ball:检查是否识别到小球:

  • else:如果没有检测到小球,调用 move_car(0) 停止小车运动。

  • time.sleep(0.1):设置适当的延时,防止处理速度过快导致系统负担过重。

五、项目总结

在本项目中,我们成功设计并实现了一款基于OpenMV的智能三轮车图像识别与跟踪系统。通过利用图像处理技术和PID控制算法,该系统能够实时识别特定颜色的小球,并精确地跟踪其运动轨迹。以下是项目的主要功能及实现过程的总结:

主要功能

  1. 实时图像采集:系统利用OV7725图像传感器,能够稳定地捕获环境中的图像数据,并将其传送至处理模块进行分析。

  2. 目标识别:通过图像处理算法,系统能够有效地识别出特定颜色的小球。我们使用了基于颜色阈值的blob检测方法,确保了在不同光照条件下的鲁棒性。

  3. 运动控制:结合STM32F765VI单片机,系统通过PID控制算法根据目标小球的位置调整小车的运动方向和速度,确保小车能够准确、快速地跟踪小球。

实现过程

  1. 环境搭建:在项目初期,我们搭建了硬件和软件环境,包括选择合适的传感器、单片机及电机驱动模块,并配置了相应的开发工具。

  2. 模块开发:

  • 图像采集模块:实现了稳定的图像采集功能,利用OpenMV IDE对图像进行处理。

  • 图像处理模块:通过设计灵活的图像处理函数,成功实现了小球的识别与定位。

  • 控制模块:运用PID控制算法,确保小车能够根据识别到的小球位置进行动态调整。

  1. 系统测试:在不同实验环境下对系统进行测试,评估其识别精度和跟踪能力。结果表明,该系统在大多数条件下均能迅速且准确地跟踪目标。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python:django项目知识点02——搭建简易授权码核销系统
  • 前端分段式渲染较长文章
  • WebGL渲染与创建2D内容
  • Redis-分片集群
  • 关于在vue2中给el-input等输入框的placeholder加样式
  • 一些关于线程之间协作的心得
  • 基于微信小程序的美食外卖管理系统
  • npm install --force or --legacy-peer-deps
  • 1网络安全的基本概念
  • LeetCode从入门到超凡(二)递归与分治算法
  • C++中move和forword的区别
  • spring自定义属性编辑器
  • SOCKS5代理为何比HTTP代理更快?
  • LeetCode63:不同路径II
  • 生成式AI:ChatGPT及其在各行业的应用前景
  • 【面试系列】之二:关于js原型
  • centos安装java运行环境jdk+tomcat
  • Java比较器对数组,集合排序
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS 面试题总结
  • React-Native - 收藏集 - 掘金
  • 笨办法学C 练习34:动态数组
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 简单实现一个textarea自适应高度
  • 线上 python http server profile 实践
  • Python 之网络式编程
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 数据库巡检项
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###项目技术发展史
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (windows2012共享文件夹和防火墙设置
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (十三)Flask之特殊装饰器详解
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (转)JAVA中的堆栈
  • (转)德国人的记事本
  • (转)人的集合论——移山之道
  • (自用)仿写程序
  • .net CHARTING图表控件下载地址
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net对接阿里云CSB服务
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell