二维码识别与定位-方法2-利用opencv扩展库aruco

2023-05-16

  二维码识别作为一种快捷准确的技术已经应用与生活中的购物支付、物体识别及工业AGV导航等领域,典型的二维码识别开源库有arcuo,alvar以及OpenCV中的二维码检测API如QRCodeDetector,在本节中我们将使用aruco库来进行二维码的识别,该库已集成在opencv的contrib集中。
本节主要讲在ROS中如何创建二维码以及如何利用相机识别二维码来获得有用的信息。并利用两个不同的二维码来表征不同的物体,进而通过识别二维码来完成物体的定位。

1.二维码创建

  二维码的创建一般是离线进行的,是二维码识别的前提。制作好的二维码粘贴到地面、物体上后才可以实现实时定位。每一个二维码通常对应一个标签,如有的二维码代表一个网站,有的二维码代表一个坐标位置,有的二维码代表一个字符串等。
  在aruco模块包含了一些预定义的字典,如下表所示,每个字典实际上是常用的一些二维码集合,这些字典涵盖了一系列的字典大小和Marker尺寸,marker可以有不同的规格.根据每个marker我们还可以生成不同像素大小的图像.

表 Aruco字典列表
序号字典字典字典字典
DICT_4x4_50DICT_4x4_100DICT_4x4_250DICT_4x4_1000
DICT_5x5_50DICT_5x5_100DICT_5x5_250DICT_5x5_1000
DICT_6x6_50DICT_6x6_100DICT_6x6_250DICT_6x6_1000
DICT_7x7_50DICT_7x7_100DICT_7x7_250DICT_7x7_1000

  在本节中我们选择字典DICT_6x6_250,其marker大小为6x6bits,字典的大小为250,即该字典中有250个大小为6*6bit的二维码.下面我们编写节点来使用该字典中的某一个二维码来生成二维码图像.

  执行如下命令,会在终端生成一个名为marker_6X6_250_31.jpg的图像,它是aruco预定义的字典DICT_6X6_250中第31个二维码,其像素大小为500*500,即宽高都为500pixels.如图所示。

$ gedit generate_marker.py

其内容如下:

import numpy as np
import cv2  
import cv2.aruco as aruco
import math
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)  
marker_id = 31
marker_img = aruco.drawMarker(aruco_dict, marker_id,500)
pic_name = "marker_6X6_250_" + str(marker_id) + ".jpg"
cv2.imwrite(pic_name,marker_img)

其图像如下:
在这里插入图片描述

图 marker_6X6_250_31图像

下面对上述代码的关键内容进行解析,aruco.Dictionary_get(aruco.DICT_6X6_250) 表示获取字典DICT_6X6_250;marker_id = 31,表示我们要生成的二维码在字典中的编号是31;aruco.drawMarker表示绘制该二维码,大小为500*500.

2. 二维码识别

得到了上述的二维码之后,我们就可以使用aruco来编写识别二维码的程序了.执行如下命令来创建二维码识别程序:

$ gedit marker_detect.py

你可在目录/cv_learn目录下看到文件qrcode_detect_demo.py.下面仅对其主要代码进行解释:

rospy.init_node('qcode_detect', anonymous=True)
detection_pub = rospy.Publisher("qcode_detect_result", Twist, queue_size=1)  # 发布图像话题名称上述代码声明了本节点的名称”qcode_detect”,且本节点检测到的物体结果信息将通过话题”qcode_detect_result”进行发布.
corners, ids, rejectedImgPoints = aruco.detectMarkers(image=gray, dictionary=aruco_dict, parameters=parameters, cameraMatrix=camera_matrix,distCoeff=camera_distortion)# 该代码用于检测图像中的二维码,其输入为经过灰度化处理的图像,要检测对象归属的二维码字典以及相机的内参。输出为检测到的二维码的四个角点的像素坐标,已检测的二维码在字典中的id编号。
ret = aruco.estimatePoseSingleMarkers(corners, marer_size, camera_matrix, camera_distortion)#该代码使用aruco中的estimatePoseSingleMarkers函数,其输入为检测到的二维码角点信息以及二维码实际打印后的尺寸(mm)。其输出为二维码在相机坐标系下的位置和姿态。此过程实际是通过PNP解算得到的。
result = Twist()
result.linear.x = tvec[0]
result.linear.y = tvec[1]
result.linear.z = tvec[2]
result.angular.x = r
result.angular.y = p
result.angular.z = y
detection_pub.publish(result)#用于发布检测到的结果,其类型采用的是Twist,包括二维码在相机坐标系x,y,z下的直角坐标,以及绕x,y,z轴的欧拉角。

将打印好的二维码放在相机视野下,然后执行如下命令启动二维码识别节点:

$ python marker_detect.py

  其检测结果如下,可以看到二维码区域已经被框选出来,且坐标轴也已标注出,其中红色表示x轴,绿色表示y轴,蓝色表示z轴。

在这里插入图片描述

图 二维码检测结果
  特别地,我们可以将二维码粘贴在物体的表面,这样当相机检测到二维码的位置和姿态时,可以间接计算出物体当前的位置和姿态,以此来达到物体检测的物体. 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维码识别与定位-方法2-利用opencv扩展库aruco 的相关文章

  • 针对不同相机(RGB 和红外)的 StereoCalibrate

    我在校准两个摄像头时遇到问题 第一个是 RGB 第二个是红外 它们有不同的分辨率 我调整了大小并裁剪了更大的图像 焦距等等 例子 RGB 1920x1080 Infrared 512x424 如何相互校准它们 我应该在stereoCalib
  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • Pyinstaller“无法执行脚本 pyi_rth_pkgres”并且缺少软件包

    这是我第一次在这里发布问题 因为我的大部分问题已经被其他人回答了 我正在 python 中开发 GUI 应用程序 并尝试使用 pyinstaller 将其打包到单个文件夹和 exe 中 以便于移植 目前 我使用 Windows 10 和 a
  • 如何计算立体视觉的基本矩阵

    我正在尝试编写一些代码来计算基本矩阵以确定立体图像之间的关系 我从大多数人推荐的 Hartley 和 Zisserman 书开始 但它没有任何实际示例 并且示例代码是在 MATLAB 中 而我没有 然后我切换到这个比较实用 里面有实际例子
  • 如何使用 SimpleBlobDetector 获取 blob 的额外信息?

    robot sherrick 回答了我这个问题 https stackoverflow com a 13534094 1705967 这是他回答的后续问题 cv SimpleBlobDetectorOpencv 2 4 中的 看起来非常令人
  • `opencv.android.JavaCameraView` 和 `opencv.android.NativeCameraView` 有什么区别

    正如主题中所述 有什么区别opencv android JavaCameraView and opencv android NativeCameraView 与其他主要优点相比 有哪些优点可以提供更多选择 来自OpenCV 文档 http
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • 使用 cv2 在 python 中创建多通道零垫

    我想用 cv2 opencv 包装器在 python 中创建一个多通道 mat 对象 我在网上找到了一些例子 其中 c Mat zeros 被 numpy zeros 替换 这看起来不错 但似乎没有多通道类型适合 看代码 import cv
  • 使用 OpenCV VideoWriter 将 RTSP 流存储为视频文件

    我正在使用 OpenCV 开发一个 Python 模块 该模块连接到 RTSP 流以对视频执行一些预处理 主要是降低 fps 和分辨率 然后将其存储在文件系统中 但是 即使在尝试了几种编解码器 寻找类似的开发之后 我总是得到一个空的视频 我
  • OpenCV Python RTSP 流

    我想使用 RTSP 从 IP 摄像机流式传输视频 但我有一个问题 我已经安装了先决条件 而且我的 RTSP 链接可以在 VlC 播放器上运行 但是当我在编辑器中尝试并运行它时 它说找不到相机 这是我的代码 import cv2 import
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • OpenCV 2.4 Jpeg 到 PNG(带 alpha 通道)

    我有一个 JPEG 和一个蒙版 我想创建一个具有三个 JPEG 通道的 PNG 并且 Alpha 通道应该是蒙版 如何使用 OpenCV 实现这一目标 Regards std vector
  • OpenCv 与 Android studio 1.3+ 使用新的 gradle - 未定义的参考

    我在使用原生 OpenCv 2 4 11 3 0 0 也可以 和 Android Studio 1 3 以及新的 ndk 支持时遇到问题 所有关于 mk 文件的教程 但我想将它与新的实验性 gradle 一起使用 使用 Kiran 答案An
  • 在 HSV 颜色空间内定义组织学图像掩模的颜色范围(Python、OpenCV、图像分析):

    为了根据颜色将组织学切片分成多个层 我修改了 OpenCV 社区提供的一些广泛分布的代码 1 我们的染色程序用不同的颜色标记组织横截面的不同细胞类型 B 细胞为红色 巨噬细胞为棕色 背景细胞核为蓝色 I m interested in se
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置

随机推荐