利用二维码定位技术实现桌面机器人简易定位方案(上篇)

目录

  • 1、前言
  • 2、二维码的定位标签识别原理
  • 3、生成定位标签
  • 3、基于定位标签的物体识别与定位

1、前言

机械手臂尤其是工业场景下大部分的应用是在一个平面(桌面)内完成一些抓取工作。一般可以用示教方式完成重复步骤。但是示教方式,对于一些活动的工件,或者相对比较开放的环境,不太适用,很多通过视觉来做定位。视觉定位最为稳定的要数二维码的识别,这个已经被无数行业场景所验证。
二维码定位本质上是轮廓监测及内外轮廓的固定关联关系的识别,以及基于平面的仿射变换:
二维码的定位原理是使用特定的图案和编码方式,在图像中确定二维码的位置和方向。二维码通常由多个小方块组成,其中包含了黑白相间的信息编码。
二维码的定位图案通常是一个大的正方形,内部包含了更小的正方形。这些小正方形被称为定位标记,用来表示二维码的位置和方向。定位标记的位置和大小是固定的,一般位于二维码的四个角落,用来确定二维码的边界。
我们可以在桌面机器人视觉定位中创造属于自己的类二维码定位框。这样就可以在精度要求不高的情况下稳定应用。
在这里插入图片描述
在这里插入图片描述

2、二维码的定位标签识别原理

二维码的定位标签是通过三层轮廓嵌套的关联关系来识别的:
在这里插入图片描述
如上,利用轮廓的包含关系,及轮廓的外内固定比例关系,判断识别到定位标签,算法流程如下:
在这里插入图片描述

对于下图:
在这里插入图片描述
通过cv.findContours()查找对应的结构的轮廓:

import cv2 

# 1.读入图片
img = cv2.imread('findContours.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
contours, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 2.寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 3.画轮廓
color=[(28, 37, 247),(62, 128, 232),(80, 172, 118),(92, 207, 152),(92, 207, 152),(188, 112, 23)]
for i in range(len(contours)):
    cv2.drawContours(img, contours, i, color[i], 3)
cv2.imshow("",img)
# 4.轮廓树层集信息
print("轮廓数:",len(contours),"层级关系",hierarchy)

运行结果如下:
在这里插入图片描述

在这里插入图片描述

cv.findContours()函数的返回值hierarchy,会发现它是一个包含4个值的数组:[Next, Previous, First Child, Parent],如下表:
在这里插入图片描述
上表对应的轮廓如下:
在这里插入图片描述
因此可以看出,我们需要找的二维码定位框是如下三层结构的轮廓:
在这里插入图片描述

3、生成定位标签

根据二维码定位标签的特点,生成定位标签就是画三个一定比例的同心正方形,如下程序生成了二维码的三个定位标签(由于二维码的背景为白色):


import cv2
import numpy as np

# 创建一个纯白图像
image = np.ones((500, 500, 3), dtype=np.uint8)*255

# 定义正方形的中心点
cxs, cys = [100, 400,100],[100,100,400]
#定义三个正方形的边长比
ratio=[7,5,3]
#定义单位边长
ul= 10

for i in range(len(cxs)):
    cx=cxs[i]
    cy=cys[i]
    for j in ratio:   
        #定义j级正方形黑色
        nextL= int(j*ul)
        # 在图像上画正方形
        x=int(cx-nextL/2)
        y=int(cy-nextL/2)
        if j==5:
            color=(255, 255, 255)
        else:
            color=(0, 0, 0)
        cv2.rectangle(image, (x, y), (x + nextL, y + nextL), color, -1)

# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.imwrite("qrmark.png", image)
cv2.destroyAllWindows()

运行结果如下:
在这里插入图片描述
运行轮廓查找结果:
在这里插入图片描述
在这里插入图片描述
TIPS:
以上发现,定位标签多了一个轮廓,一共有10各轮廓了,是怎么回事?
是应为我们生成的是白色背景,cv2.findContours默认查找白色与黑色交界处。最外的轮廓是无用的,因此可以在二值分割时,用cv2.THRESH_BINARY_INV:反二进制阈值化,超过阈值的像素点设置为0,低于阈值的像素点设置为最大值

contours, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

运行结果如下:
在这里插入图片描述
在这里插入图片描述
以上把最外面的大轮廓框给过滤掉了,剩下了九个有用的轮廓。

3、基于定位标签的物体识别与定位

在这里插入图片描述
如上图所示,我们可以在工作面中增加3个定位landmark,用于对工作面内物体的定位,并将定位信息关联到机械臂中。

如何具体实现,见下篇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

过氧化氢滴定方法可用的PFA器皿有哪些?

滴定液:KMnO4标准溶液 试液:H2O2商品液(3%),H2SO4 (3.0mol/L ) 指示剂:酚酞指示剂 仪器:分析天平,PFA酸式滴定管50mL,PFA 移液管10mL/25mL、PFA 容量瓶250mL、PFA锥形瓶250mL 1、KMnO4标准溶液浓度的标定(见实验:高锰酸钾标准溶液的配制与…

记一次普通的单表查询sql优化,去掉文件排序

一现象: 有空观察了线上某个sql语句执行计划,发现在500多毫秒左右,打算进行下优化。 二步骤: 对查询列assessment_periodic_id、assessment_user_id、create_time添加了组合索引并指定了倒叙。加入create_time 使查询结果不需要在…

阿里云OSS 存储对象的注册与使用

目录 一、什么是阿里云OSS 二、 点击免费试用 2.1 选择第一个,点击免费试用 ​编辑 2.2 登录管理控制台 2.3 进入Bucket 2.4、在阿里云网站上的个人中心配置Accesskey,查询accessKeyId和accessKeySecret。 2.5、进入AccssKey管理页面应该会出现下图提示&…

通用大模型研究重点之五:llama family

LLAMA Family decoder-only类型 LLaMA(Large Language Model AI)在4月18日公布旗下最大模型LLAMA3,参数高达4000亿。目前meta已经开源了80亿和700亿版本模型,主要升级是多模态、长文本方面工作。 模型特点:采用标准的…

Java面试八股之Java异常处理完成后,Exception对象会发生什么变化

Java异常处理完成后,Exception对象会发生什么变化 这个题的难度在于,看到题之后可能不知道面试官想问什么。在面试中,如果实在没明白,可以让面试官再深入阐述一下。 Java异常处理完成后,Exception对象失去了程序中的…

自定义Blazor单文件Web程序端口

#接 上篇 Mysql快速迁移版的制作过程# 上一篇《Mysql8快速迁移版的制作过程》完成了快速迁移的数据库的准备,今天接着讲基于Blazor的Web程序快速迁移版的制作。 单文件发布的难点不在发布而是因为程序系统默认给了个5001的端口,而是如何能够让用户自定…

Leetcode 11.盛最多水的容器(暴力->双指针)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 示例 …

Postman调用OpenApi接口

首先你需要科学上网。。。。。 请求方式:post 请求地址:https://api.openai.com/v1/chat/completions 请求头: Authorization : Bearer key Content-Type : application/json Body : { "messages": [{ "role": &quo…

【精简改造版】大型多人在线游戏BrowserQuest服务器Golang框架解析(1)——功能清单

1.匿名登录 2.服务连接 3.新手引导 4.随机出生点 5.界面布局 6.玩法帮助 7.NPC会话 8.成就系统 9.成就达成 10.用户聊天 11.战斗&信息展示 12.药水使用 13.副本传送 14.玩家死亡 15.超时断开

OpenHarmony 视图缩放组件—subsampling-scale-image-view

简介 深度缩放视图,图像显示,手势平移缩放双击等 效果图(旋转、缩放、平移) 下载安装 ohpm install ohos/subsampling-scale-image-view OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包 使…

Servlet第四篇【request对象常用方法、应用】

什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。 简单来说,要得…

mysql四种引擎区别

MySQL 提供了多种不同的数据库引擎,其中最常见的有 MyISAM、InnoDB、MEMORY 和 BLACKHOLE。这四个引擎分别有以下特点: 1. MyISAM MyISAM 是 MySQL 的默认引擎。它对于只有较少的修改、大量读取的应用场景具有良好的性能。它不支持事务处理,也…

理解字符串常量池(JVM)

大纲 思考 如何查看字符串常量池(StringTable)? 使用 jclasslib 插件打开字节码,选择 常量池 -> 显示所选 -> CONSTANT_String_info,左侧过滤后的内容即为字符串常量池 字符串常量池、方法区、永久代和元空间的…

Dynamic Wallpaper for Mac:动态壁纸让桌面更生动

Dynamic Wallpaper for Mac是一款为苹果电脑用户精心设计的动态壁纸软件,它以其丰富的功能和精美的壁纸库,为用户带来了更加生动和个性化的桌面体验。 Dynamic Wallpaper for Mac v17.8中文版下载 这款软件支持多种动态壁纸,用户可以根据自己…

unity学习(86)——细节优化

东西已经做出来了,现在需要的是优化,说得简单,做起来难。 1.122包的优化,避免重复创建! 2.为何会出现一边动,一边不动的情况。重复登录后依旧是unity可以看到移动,但是exe那边看不到移动&#…

数据结构PT1——线性表/链表

1:顺序存储实现(数组实现) Data: a1 a2 .....ai ai1 .... an .... typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个 struct LNode{ //结构体成员ElementT…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

Jackson 2.x 系列【24】Spring Web 集成

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 源码地址:https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. Spring Web3. Jackson2ObjectMapperBuilder4. Jackson2ObjectMapperFa…

探索传感器世界:类型与应用详解

传感器是一种能感知并测量特定物理量、化学量或其他参数,并将其转换为可供处理、记录或控制的电信号的装置。 物联网传感器设备种类繁多,以下是一些常见的类型: 一、 温度传感器 1、热电阻温度传感器:利用金属的电阻随温度变化的…

Java编程题 | 数组元素交换

大家可以关注一下专栏,方便大家需要的时候直接查找,专栏将持续更新~ 题目描述 编写一个Java程序,输入一个整数数组,将最大的元素与第一个元素交换,最小的元素与最后一个元素交换,然后输出修改后的数组…