【OpenMV】AprilTag标记跟踪 NCC模板匹配 测距与测量物体大小

news2024/12/24 20:50:37

目录

AprilTag标记跟踪

NCC模板匹配

测距以及测量物体大小

识别乒乓球的距离与大小 

红色矩形与蓝色矩形同时识别


AprilTag标记跟踪

Tag36h11,Tag25h9,Tag16h5

Tag36h11信息量更大,更准确

# AprilTags Example
#
# This example shows the power of the OpenMV Cam to detect April Tags
# on the OpenMV Cam M7. The M4 versions cannot detect April Tags.

import sensor, image, time, math

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
sensor.skip_frames(30)
sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...关闭白平衡
clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
    for tag in img.find_apriltags(): # defaults to TAG36H11 without "families".
        img.draw_rectangle(tag.rect(), color = (255, 0, 0))     #画框
        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0)) #画十字
        degress = 180 * tag.rotation() / math.pi                #求April Tags旋转的角度
        print(tag.id(),degress)

NCC模板匹配

使用方法:
模板匹配需要插内存卡(方向:摄像头对准自己,看到内存卡背面)
用helloworld.py例程拍照
将1 2 3 4 5 6 数字的图片拍下来,就是保留住画面,然后终止脚本
用鼠标框起来所要识别的数字,右键框框,保存到PC,选择一个位置,保存图像的格式是bmp格式
百度搜一个bmp转pgm图像格式的网站,将图像转换过去,网站如下:
https://onlineconvertfree.com/zh/convert-format/bmp-to-pgm/
将图片导出,保存到SD卡中


修改29~30行代码
template1 = image.Image("/1.pgm")
template2 = image.Image("/2.pgm")
template3 = image.Image("/3.pgm")
修改图像的名称


最后
多循环几次
r1
r2
r3

# Template Matching Example - Normalized Cross Correlation (NCC)
#
# This example shows off how to use the NCC feature of your OpenMV Cam to match
# image patches to parts of an image... expect for extremely controlled enviorments
# NCC is not all to useful.
#
# WARNING: NCC supports needs to be reworked! As of right now this feature needs
# a lot of work to be made into somethin useful. This script will reamin to show
# that the functionality exists, but, in its current state is inadequate.

import time, sensor, image
from image import SEARCH_EX, SEARCH_DS

# Reset sensor
sensor.reset()

# Set sensor settings
sensor.set_contrast(1)
sensor.set_gainceiling(16)
# Max resolution for template matching with SEARCH_EX is QQVGA
sensor.set_framesize(sensor.QQVGA)
# You can set windowing to reduce the search image.
#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))
sensor.set_pixformat(sensor.GRAYSCALE)

# Load template.
# Template should be a small (eg. 32x32 pixels) grayscale image.
template1 = image.Image("/1.pgm")
template2 = image.Image("/2.pgm")
template3 = image.Image("/3.pgm")

clock = time.clock()

# Run template matching
while (True):
    clock.tick()
    img = sensor.snapshot()

    # find_template(template, threshold, [roi, step, search])
    # ROI: The region of interest tuple (x, y, w, h).
    # Step: The loop step used (y+=step, x+=step) use a bigger step to make it faster.
    # Search is either image.SEARCH_EX for exhaustive search or image.SEARCH_DS for diamond search
    #
    # Note1: ROI has to be smaller than the image and bigger than the template.
    # Note2: In diamond search, step and ROI are both ignored.
    r1 = img.find_template(template1, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
    if r1:
        img.draw_rectangle(r1, color=(255,0,255))
    
    r2 = img.find_template(template2, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
    if r2:
        img.draw_rectangle(r2)
        
    r3 = img.find_template(template3, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
    if r3:
        img.draw_rectangle(r3)
    print(clock.fps())

学习视频链接: 

OpenMV使用NCC模板匹配 | 星瞳科技 (singtown.com)
OpenMV使用AprilTag标记追踪 | 星瞳科技 (singtown.com)

测距以及测量物体大小

根据测量的像素点数,求出比例K,进而计算出距离或者物体大小

例程:

距离 = 一个常数K / 直径的像素Lm

先用这个公式求出K: 

具体操作:

print(Lm)   # Lm = 67 输出像素数
 

print 输出 Lm=67   距离=16,所以K=16cm*67=1072

定义:(写在while(True):上面)

K_Distance = 1072

然后计算距离,输出距离:

Distance = K_Distance / Lm

print(Distance)
 

测量物体大小,距离摄像头越近,像素数越大,是正比关系,所以 实际大小 = K*直径的像素

定义:

K_size = 0.143  #实际大小 = K*直径的像素,K=3.5cm/67            实际大小与下摄像头里的像素成正比

添加代码:

Size = K_size * Lm

        print (Size)

识别乒乓球的距离与大小 

黄色球形例程代码:
# Measure the distance
#
# This example shows off how to measure the distance through the size in imgage
# This example in particular looks for yellow pingpong ball.
import sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold   = (57, 100, 17, 88, 99, 32)  #(37, 92, -5, 52, 89, 37)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.    用颜色识别进行测量,需要关闭白平衡!
clock = time.clock() # Tracks FPS.
K_Distance = 1072           # K = 距离*像素 = 16cm * 67       实际长度和摄像头里的像素成反比
K_size = 0.0522  #实际大小 = K*直径的像素,K=3.5cm/67           实际大小与下摄像头里的像素成正比
while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # Take a picture and return the image.
    blobs = img.find_blobs([yellow_threshold])
    if len(blobs) == 1:
        # Draw a rect around the blob.
        b = blobs[0]
        img.draw_rectangle(b[0:4]) # rect
        img.draw_cross(b[5], b[6]) # cx, cy
        Lm = (b[2]+b[3])/2		   #(长+宽)/2 = 像素数Lm
        Distance = K_Distance / Lm

        #print(Lm)   # Lm = 67 输出像素数
        print(Distance)     #输出距离

        Size = K_size * Lm
        print (Size)        #输出大小

    #print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
    # connected to your computer. The FPS should increase once disconnected.

红色矩形与蓝色矩形同时识别

这里我拿了魔方,拧成上面是6个红色色块,下面三个是蓝色色块,只识别这一面即可

红色矩形的识别代码
蓝色矩形的识别代码,返回高度和宽度


# Measure the distance
#
# This example shows off how to measure the distance through the size in imgage
# This example in particular looks for yellow pingpong ball.
import sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold   = (57, 100, 17, 88, 99, 32)  #(37, 92, -5, 52, 89, 37)
red_threshold   = (15, 61, 48, 116, 53, 19) #红色阈值
blue_threshold   = (31, 47, 26, -28, -51, -15) #蓝色阈值
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.    用颜色识别进行测量,需要关闭白平衡!
clock = time.clock() # Tracks FPS.
K_Distance = 1072           # K = 距离*像素 = 16cm * 67       实际长度和摄像头里的像素成反比
K_size = 0.0522  #实际大小 = K*直径的像素,K=3.5cm/67           实际大小与下摄像头里的像素成正比
while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # Take a picture and return the image.
    blobs = img.find_blobs([yellow_threshold])  #识别黄色
    if len(blobs) == 1:
        # Draw a rect around the blob.
        b = blobs[0]
        img.draw_rectangle(b[0:4]) # rect
        img.draw_cross(b[5], b[6]) # cx, cy
        Lm = (b[2]+b[3])/2		   #(长+宽)/2 = 像素数Lm
        Distance = K_Distance / Lm

        #print(Lm)   # Lm = 67 输出像素数
        print(Distance)     #输出距离
        Size = K_size * Lm
        print (Size)        #输出大小

    Bolb2 = img.find_blobs([red_threshold]) #识别红色
    if len(Bolb2) == 1:
        # Draw a rect around the blob.
        blocation = Bolb2[0]
        img.draw_rectangle(blocation[0:4]) # rect
        img.draw_cross(blocation[5], blocation[6]) # cx, cy
        h = K_size * blocation[3]
        w = K_size * blocation[2]
        print("红色高:%s cm, 红色宽:%s cm " %(h,w))

    Bolb3 = img.find_blobs([blue_threshold])    #识别蓝色
    if len(Bolb3) == 1:
        # Draw a rect around the blob.
        local_blue = Bolb3[0]
        img.draw_rectangle(local_blue[0:4]) # rect
        img.draw_cross(local_blue[5], local_blue[6]) # cx, cy
        h = K_size * local_blue[3]
        w = K_size * local_blue[2]
        print("蓝色高:%s cm, 蓝色宽:%s cm " %(h,w))

    #print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
    # connected to your computer. The FPS should increase once disconnected.

这样就可以同时识别红色和蓝色色块了

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

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

相关文章

STM32晶振的选择与计算

目录 1、石英晶体特性和型号2、振荡器理论2.1负电阻2.2跨导2.3负阻振荡器原理 3、皮尔斯振荡器设计3.1 皮尔斯振荡器简介3.2反馈电阻器3.3负载电容3.4振荡器跨导3.5驱动电平和外部电阻计算3.5.1计算驱动电平3.5.2另一种驱动电平测量方法3.5.3计算外部电阻 3.6启动时间3.7晶体拉…

Python_面向对象

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作数据的方法组合在一起,以便将数据和行为视为一个整体。这种编程范式的历程可以追溯到20世纪60年代,但直到80年代才开始流行。…

【C语言】【结构体的位段】位段的内存分配及注意事项

1.什么是位段: struct A { int _a:2; int _b:5; int _c:10; int _d:30; };1.A就是一个位段类型的变量,位表示比特位,意思是 A中的变量申请内存的比特位数 比如 _a要占 2 个bit 2.位段的成员必须是 int ,unsigned int ,signed int 类型的&…

瑞吉shardingjdbc4.0.0-RC1-->RC2 读写分离示例错误排查

linux环境:CentOS7.8mysql5.7.29 idea:jdk1.8maven3.5 框架:springboot2.4.5 mybatisplus3.4.2(mybatis-plus-boot-starter)sharding-jdbc4.0.0-RC2(sharding-jdbc-spring-boot-starter兼容性问题由1改成2)druid B站项目视频:…

格拉姆角场GAF将时序数据转换为图像并应用于凯斯西楚大学轴承故障诊断(Python代码,CNN模型)

1.运行效果: 格拉姆角场GAF将时序数据转换为图像并应用于故障诊断(Python代码)_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 2.GAF的内容 GAF是一种用于时间序列数据可视化和特征提取的技术,通常用于…

小谈设计模式(9)—工厂方法模式

小谈设计模式(9)—工厂方法模式 专栏介绍专栏地址专栏介绍 工厂方法模式角色分类抽象产品(Abstract Product)具体产品(Concrete Product)抽象工厂(Abstract Factory)具体工厂&#x…

去雨去雪去雾数据集构建

在进行去雨去雪去雾算法的学习过程中,需要构建去雨去雪去雾数据集,本文参考Learning Multiple Adverse Weather Removal via Two-stage Knowledge Learning and Multi-contrastive Regularization: Toward a Unified Model论文中的数据集设定&#xff0c…

15np+pandas+matplotlib

numpy 维数 一维:shape(4,)二维:shape(4,5)三维:shape(4,5,6) 创建ndarray–np.array() # 可以是数组[1,2,3] 元组(1,2,3) 迭代对象range(n) np.array([1,2,3,4,5])列表中元素类型不同,会使用元素类型最大的作为ndarray类型 指定维度ndim 赋值操作 赋值&#xff…

【SpringBoot学习】收藏的学习资料,精!

文章目录 Spring实战(第五版): https://potoyang.gitbook.io/spring-in-action-v5/di-er-bu-fen-ji-cheng-spring Spring实战(第五版): https://potoyang.gitbook.io/spring-in-action-v5/di-er-bu-fen-ji-…

【cv】图像预处理技术——从特征检测讲述图像预处理理论、实践、应用|01

博主简介:努力学习的22级计算机科学与技术本科生🌸博主主页: 是瑶瑶子啦每日一言🌼: 每一个不曾起舞的日子,都是对生命的辜负。——尼采 文章目录 前言0、特征检测、特征提取、特征描述、特征匹配一、图像预处理概述二…

十、空闲任务及其钩子函数

1、空闲任务的介绍 (1)一个良好的程序,它的任务都是事件驱动的:平时大部分时间处于阻塞状态。 (2)有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务。所以,我们要提供空闲任务。 (3)在使用vTas…

一站式企业协同研发云——云效

一站式企业协同研发云——云效 文章目录 一站式企业协同研发云——云效什么是云效云效的作用云效使用说明公司领导操作步骤项目创建者或项目组长操作步骤项目上线部署 什么是云效 云效是一种基于云计算技术的软件研发与交付管理平台,旨在提高团队的协作效率和软件交…

读者写者问题—内含408真题

读者写者问题—含408 一、问题描述 一个数据问价或记录可以被多个进程共享,我们把只读该文件的进程称为“读者进程”,其他进程为“写者进程”。允许多个进程同时读一个共享对象,但不允许一个写者进程和其他写者进程或读者进程同时访问共享对…

ElementUI结合Vue完成主页的CUD(增删改)表单验证

目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中,CU代表创建(Create&#xff09…

通过Nginx配置域名映射到本地项目

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

Spring的注解开发-Spring配置其它注解

Spring配置其它注解 Primary 拓展:Primary注解用于标注相同类型的Bean优先被使用权,Primary是Spring3.0引入的,与Componen(及其衍生的三个注解)t和Bean一起使用,标注该Bean的优先级更高,则在通…

【知识回顾】Java常用类库-Java Runtime

文章目录 一、快速入门1.1 Runtime 介绍1.2 常用方法1.2.1 基本方法1.2.2 行为控制类1.2.3 系统信息类1.2.4 exec1.2.5 其他方法1.2.6 注意事项 二、基本使用2.1 获取当前虚拟机信息2.2 操作系统进程2.3 Process对象 三、业务场景实战3.1 执行外部脚本3.2 动态加载类 四、小结 …

《数据结构、算法与应用C++语言描述》-栈的应用-迷宫老鼠问题

迷宫老鼠 问题描述 迷宫(如图 8-9 所示)是一个矩形区域,有一个入口和一个出口。迷宫内部包含不能穿越的墙壁或障碍物。这些障碍物沿着行和列放置,与迷宫的边界平行。迷宫的入口在左上角,出口在右下角。 假定用 nxm 的…

【Java每日一题】——第十六题:将数组元素逆序并遍历输出。(2023.09.30)

🕸️Hollow,各位小伙伴,今天我们要做的是第十五题。 🎯问题: 设有数组如下:int[] arr{11,34,47,19,5,87,63,88}; 测试结果如下: 🎯 答案: int a[]new int [10];Random …

《三国志》游戏的MySQL数据设计与管理

在任何成功的游戏背后,都有一个精心设计和管理的数据系统。这不仅决定了游戏的运行效率,还直接影响到玩家的游戏体验。 本文将深入探讨著名游戏《三国志》中的数据设计和管理。本文将讲解游戏中核心的数据元素、数据管理方法,以及开发团队在数据方面所做的工作。 文章目录 …