• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

3.5.2-1模板匹配识别 1-只匹配一个模板 openmv视觉

04/10 08:50
801
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

联系方式.txt

共1个文件

**非常详细的视频和文字教程,讲解常见的openmv教程包括 巡线、物体识别、圆环识别、阈值自动获取等。非常适合学习openmv、K210、K230等项目
视频合集链接在


openmv教程合集 openmv入门到项目开发 openmv和STM32通信 openmv和opencv区别 openmv巡线 openmv数字识别教程LCD

专刊openmv视觉文章链接:
https://blog.csdn.net/qq_46187594/category_12900902.html

3.5.1-不同数字识别方案的大概介绍

截至现在openmv实现的数字识别方案有几个大类,

  1. 模板匹配识别方案 大概效果:最后优化 将可能色块缩放到模板大小一样,能够完成不错效果,且识别速度很快,但是倾斜数字识别效果一般。
  2. mnist数字数据集识别方案 大概效果: 只能一次识别一个数字,效果一般。
  3. openmv 目标检测识别 大概效果:效果根据数据集来定,数据集中出现的情况都能比较好的识别,所以需要根据自己的需要采集适合的数据集,识别帧率稍微慢些。具体的识别效果和帧率怎么样大家可以看后面的视频展示的,或者自己实现测试看看是否满足需要这里大家尽量和我使用一样的openmv IDE软件版本和一样的openmv 固件版本,也可能出现一些错误,如果错误要学会调试解决,可以提供下面思路: 出现了什么现象或者报错?是否测试过自己电脑USB是否可能有问题或者用朋友电脑试试?是否重启电脑尝试过?

    是否在必应或谷歌或者AI上检索提问,是否按照给出信息尝试解决错误? 自己本身使用的openmv 固件还有openmv IDE 是否 测试过和 视频一样的软件和固件版本,是否测试测试过最新的软件和固件版本。

3.5.2-模板匹配识别

1-只匹配一个模板

我们只匹配一个模板的时候不需要插上SD卡

无论是使用openmv H7 还是 openmv H7 plus做下面各种数字识别方案基本都是不需要使用SD卡,除非你使用模型特别大或者模板特别多,所以 建议大家可以先不用SD进行测试使用,如果空间不足再使用SD卡,这样也可以节省一点。

首先,我们需要创建或导入一个模板,注意这个模板必须得是pgm格式的,而且大小有限制,不能超过openmv的像素大小。 我们可以直接从openmv里面截取一个模板图像,可以先运行基础的摄像头图像获取的例程,让openmv IDE软件 显示出图像,然后进行截取。

比如先运行这个之前的代码

# This work is licensed under the MIT license.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!

import sensor # 引入感光元件的模块,用于操作摄像头传感器
import time # 引入时间模块,用于控制时间延迟和FPS计算

# 初始化传感器
sensor.reset()  # Reset and initialize the sensor. 重置并初始化传感器
sensor.set_pixformat(sensor.RGB565)  # Set pixel format to RGB565 (or GRAYSCALE) 设置像素格式为RGB565(或者灰度)
sensor.set_framesize(sensor.QVGA)  # Set frame size to QVGA (320x240) 设置帧大小为QVGA(320x240分辨率)
#***************************如果不需要镜像就注释掉 下面 的代码********************
# 设置摄像头镜像/翻转操作,根据摄像头安装的方向决定是否需要
sensor.set_vflip(True)  # 垂直方向翻转。根据实际摄像头模块的安装位置调整是否需要此操作
#!!!重要:不同摄像头是否需要镜像,根据实际情况定。如果不需要镜像,请注释掉以下代码:
sensor.set_hmirror(True)  # 水平方向反转。根据实际摄像头模块的安装位置调整是否需要此操作
#!!!重要:不同摄像头是否需要镜像,根据实际情况定。如果不需要镜像,请注释掉上述代码。
#***************************如果不需要镜像就注释掉 上面 的代码********************
sensor.skip_frames(time=2000)  # Wait for settings take effect. 等待2秒钟让设置生效
clock = time.clock()  # Create a clock object to track the FPS. 创建一个时钟对象,用于追踪FPS(每秒帧数)



while True:
    clock.tick()  # Update the FPS clock. 更新FPS时钟
    img = sensor.snapshot()  # Take a picture and return the image. 拍摄一张照片并返回图像
    print(clock.fps())  # 输出当前的帧率(FPS),用来衡量摄像头的拍摄速度
    # Note: OpenMV Cam runs about half as fast when connected
    # to the IDE. The FPS should increase once disconnected.
    # 注意:当OpenMV相机连接到IDE时,速度大约是平时的一半。断开连接后,FPS应该会提高。

然后把openmv和要识别的物体

截取模板的时候物体光线要和真实识别的时候基本一样

摄像头照射角度和举例,真实识别的要基本一样

然后不要在IDE上开启缩放

右击讲框选的模板区域保存到PC
在这里插入图片描述选择保存到电脑
在这里插入图片描述
同样道理保存你要识别的数字模板,这里保存的是0-9,如果你只识别1-8那么你只保存1-8就可以了

注意从openmv里面直接截取保存的图片是bmp格式的,我们需要把它转换成pgm格式。可以在这个网站进行在线转换https://convertio.co/zh/bmp-pgm/ 或者BMP 到 PGM - 将您的 BMP 转换为 PGM 的在线工具 或者免费BMP转PGM在线转换器 三个网站都可以,或者也可以百度上搜索BMP格式转pgm格式。

网站上转化后保存如下

在这里插入图片描述
然后选择你要匹配那个模板,放到openmv识别的内存中,比如我们这里演示识别数字9
在这里插入图片描述
代码如下:

# 模板匹配示例 - 归一化交叉相关算法(NCC)
# 功能增强说明:
# 1. 增加模板文件名显示在识别框上方
# 2. 添加识别结果输出功能
# 3. 优化代码结构并增加详细注释

import time
import sensor
import image
from image import SEARCH_EX, SEARCH_DS  # 导入搜索模式常量

# ******************** 系统初始化配置 ********************
# 初始化摄像头传感器
sensor.reset()

# 设置图像参数
sensor.set_contrast(1)          # 对比度设置(范围0-3)
sensor.set_gainceiling(16)      # 增益上限(防止过曝光)
sensor.set_framesize(sensor.QQVGA)  # 设置分辨率160x120(NCC算法推荐分辨率)
sensor.set_pixformat(sensor.GRAYSCALE)  # 使用灰度图模式(提升处理速度)

# 摄像头安装方向校正(根据物理安装情况选择)
sensor.set_vflip(True)   # 垂直翻转图像
sensor.set_hmirror(True) # 水平翻转图像

# ******************** 用户可配置参数 ********************
TEMPLATE_PATH = "/9.pgm"        # 模板文件存储路径
MATCH_THRESHOLD = 0.70          # 匹配阈值(0.0-1.0,值越大匹配越严格)
SEARCH_STEP = 4                 # 搜索步长(越大搜索越快,但可能漏检)
SEARCH_MODE = SEARCH_EX         # 搜索模式:SEARCH_EX-全搜索,SEARCH_DS-菱形搜索
TEXT_COLOR = 255                # 显示文本颜色(灰度值,255=白色)
FRAME_MARGIN = 5                # 文字与识别框的间距(像素)

# 加载模板图像
try:
    template = image.Image(TEMPLATE_PATH)
    print("成功加载模板:", TEMPLATE_PATH)
except Exception as e:
    raise Exception("模板加载失败:%s" % str(e))

# 创建性能计数器
clock = time.clock()

# ******************** 主循环 ********************
while(True):
    clock.tick()  # 开始跟踪帧率
    
    # 捕获一帧图像
    img = sensor.snapshot()
    
    # 执行模板匹配
    # find_template参数说明:
    # template: 模板图像对象
    # threshold: 匹配阈值(0.0-1.0)
    # roi: 感兴趣区域(x,y,w,h),默认全图搜索
    # step: 搜索步长(越大越快,精度越低)
    # search: 搜索模式(SEARCH_EX或SEARCH_DS)
    result = img.find_template(template, MATCH_THRESHOLD, 
                              step=SEARCH_STEP, search=SEARCH_MODE)
    
    # 如果检测到目标
    if result:
        # 解包匹配结果(x,y,w,h)
        x, y, w, h = result
        
        # 绘制识别框
        img.draw_rectangle(result, color=TEXT_COLOR)
        
        # 在识别框上方显示文件名
        # 计算文本位置:x坐标对齐框左侧,y坐标在框上方
        text_x = x
        text_y = y - FRAME_MARGIN if y > FRAME_MARGIN else 0
        img.draw_string(text_x, text_y, TEMPLATE_PATH.split('/')[-1],  # 显示文件名
                       color=TEXT_COLOR, scale=0.5)
        
        # 通过输出识别结果
        # 格式:检测时间(ms), 模板文件名, 坐标(x,y), 匹配相似度
        # 注意:实际相似度需要从匹配结果中获取,当前固件暂不支持返回相似度值
        print("[{:.0f}] 检测到模板: {}, 位置: ({},{})".format(
            time.ticks_ms(), TEMPLATE_PATH, x, y))
    
    # 显示帧率(保留1位小数)
    fps = clock.fps()
    img.draw_string(5, 5, "FPS:%.1f" % fps, color=TEXT_COLOR)
    print("当前帧率:", fps)

识别结果显示情况如下:
在这里插入图片描述

  • 联系方式.txt
    下载
点赞
收藏
评论
分享
加入交流群
举报

相关推荐

方案定制

去合作
方案开发定制化,2000+方案商即时响应!