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

news2024/9/24 6:27:21

一、项目概述

目标和用途

本项目旨在设计一款智能三轮车,通过图像识别技术实现对特定颜色小球的自动跟踪。该系统具有实时性和高精度的特点,适用于教育机器人、智能监控及自动导航等多个领域。通过采用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
        # 找到面积最大的blob
        blob = max(blobs, key=lambda b: b.pixels())
        img.draw_rectangle(blob.rect())  # 在图像上绘制矩形框
        img.draw_cross(blob.cx(), blob.cy())  # 在小球中心绘制十字标记
        return blob  # 返回检测到的blob
    return 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:  # 如果控制信号为0
        motor_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,波特率115200

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

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

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

相关文章

元器件数据手册识别工具

数据手册识别方案&#xff0c;目前有多家厂商实现了这个功能&#xff0c;分别采用不同的技术路线实现。 基于AI方法&#xff1a;使用大量的数据手册进行训练&#xff0c;训练后的将模型文件提供给客户&#xff0c;用户在程序中加载模型文件和数据手册得到手册里面的数据结果。 …

Python中requests模块(爬虫)基本使用

Python的requests模块是一个非常流行的HTTP库&#xff0c;用于发送HTTP/1.1请求。 一、模块导入 1、requests模块的下载&#xff1a; 使用包管理器下载&#xff0c;在cmd窗口&#xff0c;或者在项目的虚拟环境目录下&#xff1a; pip3 install -i https://pypi.tuna.tsingh…

JUC高并发编程1:JUC概述

1 什么是JUC 1.1 JUC简介 JUC就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包&#xff0c;JDK 1.5 开始出现的。 1.2 进程与线程 进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中用于实现多任务处理的两种基本概…

Linux 基本指令的学习

01. ls 指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

计算机二级C语言疑难

1.strcpy函数 在C语言中strcpy&#xff08;&#xff09;函数会将字符串2&#xff08;包括字符串结束字符/0&#xff09;的函数覆盖到字符串1&#xff0c;如果字符串1没有足够的空间容纳字符串会导致缓冲溢出的错误 例题&#xff1a;程序设计 规定输入的字符串中只包含字母和…

2.Spring-容器-注入

注册&#xff1a;将组件放入容器中&#xff1b; 注入&#xff1a;让容器按需进行操作&#xff1b; 一、Autowired&#xff1a;自动注入组件 原理&#xff1a;Spring调用容器的getBean 二、Qualifier 精确指定 精确指定&#xff1a;如果容器中组件存在多个&#xff0c;则使用…

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强

Nginx基础详解1(单体部署与集群部署、负载均衡、正反代理、nginx安装)

本阶段的任务 1.学会集群的操作概念 2.完成对Nginx的入门操作 3.使用Nginx实现集群和负载均衡 4.使用Nginx实现高可用的方案 目录 1.单体部署与集群部署 1.1单体部署的概念 1.2单体部署的优缺点 1.3集群部署的概念 1.4集群部署的优缺点 1.5集群部署需要注意的点 1.…

嵌入式linux方向细分工作岗位分析

大家好,今天主要给大家分享一下,linux方向细分的工作岗位有哪些?,为即将进入linux领域的开发者指明方向。 第一:总结分布 第二:Linux BSP工程师岗位 工作内容: 1、开发和维护Linux系统的板级支持包(BSP),包括启动加载程序、设备驱动、文件系统等。 2、负责解决硬件和软…

2003-2022年各省区域创新能力评价相关指标数据(报告年份2003-2022年)

2003-2022年各省区域创新能力相关指标数据&#xff08;报告年份2003-2022年&#xff09; 1、来源&#xff1a;2003-2022年中国区城创新能力评价报告 2、指标&#xff1a;综合值、知识创造综合指标、研究开发投人综合指标、专利综合指标、科研论文综合指标、知识获取综合指标、…

个人导航网站介绍和部署

前言&#xff1a; 大家好&#xff0c;我是神的孩子都在歌唱&#xff0c;这是我csdn的博客 , 这是我做的一个神唱导航网站项目&#xff0c;这是一个练习项目&#xff0c;所以还存在很多问题&#xff0c;目的是方便收集和查阅日常浏览的网站&#xff0c;代码完全开源github&#…

LeetCode 面试经典150题 201.数字范围按位与

题目&#xff1a;给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 提示&#xff1a;0 < left < right < 2^31 - 1 思路&#xff1a; 位与的特性…

leetcode91. 解码方法,动态规划

leetcode91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; “1” -> ‘A’ “2” -> ‘B’ … “25” -> ‘Y’ “26” -> ‘Z’ 然而&#xff0c;在 解码 已编码的消息时&#xff0c;你意识到有许多不同的方式来解码&#xff0c;…

【漏洞复现】HIKVISION 视频编码设备接入网关 showFile.php 任意文件下载漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

PHP智慧教育新篇章优校管理系统小程序源码

智慧教育新篇章 —— 优校管理系统 &#x1f680;【开篇启航&#xff1a;智慧教育的浪潮已至】 在这个日新月异的时代&#xff0c;教育也在悄然发生着变革。随着科技的飞速发展&#xff0c;智慧教育已成为教育领域的新风尚。而“优校管理系统”&#xff0c;正是这股浪潮中的佼…

Keil5 操作

目录 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 2.代码提示设置&#xff1a; 3.添加. c与.h文件&#xff1a; 常用技巧 安装下载推荐&#xff1a;正点原子 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 文章讲解 …

【例题】证明极限

已知&#xff1a; ∀ ε > 0 , ∃ n > N , ∣ a n − A ∣ < ε \forall \varepsilon >0, \exist n>N,|a_n-A|<\varepsilon ∀ε>0,∃n>N,∣an​−A∣<ε 目标&#xff1a; ∀ ε > 0 , ∃ n > N 1 , ∣ a 1 . . . a n n − A ∣ < ε \…

pytorch学习笔记二:用pytorch神经网络模型做气温预测、分类任务构建和分类网络构建、卷积神经网络原理介绍

文章目录 一、搭建pytorch神经网络进行气温预测1&#xff09;基础搭建2&#xff09;实际操作标识特征和标签3&#xff09;构建成标准化的预处理数据&#xff08;做标准化收敛速度更快&#xff09; 二、按照建模顺序构建完成网络架构1&#xff09;np.array格式的标签(y)和特征(x…

从入门到精通:计算机视觉学习路线与实战项目推荐

全面解析计算机视觉的学习路径&#xff0c;深入探讨关键技术与实战项目&#xff0c;助您快速掌握核心技能 引言 随着人工智能的飞速发展&#xff0c;计算机视觉已成为AI领域中最具潜力和应用价值的分支之一。从自动驾驶到医疗影像分析&#xff0c;计算机视觉技术正在改变我们的…

9.23-部署项目

部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: ma…