使用电脑摄像头计算aruco marker位姿(Python)

2023-05-16

一、效果图

刚做了一些尝试,算两个aruco之间的距离
先算x方向,用ID=12减去ID=13,tvec的三个坐标依次是Z、Y、X。
所以,ID=12和ID=13的x距离为1.692-1.539=0.153(m), 15.3cm, 实际距离为11cm, 所以有误差

算y方向,用ID=12减去ID=14,
所以,ID=12和ID=14的距离为-0.063-0.119=-0.182(m), 18.2cm,实际距离为11cm. 有误差

12

ID=12,用平移向量计算两个aruco之间的距离

13

ID=13

14

ID=14

二、笔记本摄像头的标定

进行Aruco码可视化前,需要知道相机的参数,具体为内参数mtx, 畸变参数dist.
需要准备一个棋盘格,拍摄十几张图片,代码如下:

我的棋盘格是7X10的,需要改的参数有棋盘格的行列数,每格的大小毫米数,图片的路径

import cv2
import numpy as np
import glob
import matplotlib.pyplot as plt
import matplotlib.patches as patches

# 找棋盘格角点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # 阈值
#棋盘格模板规格
w = 9   # 10 - 1      注意改!!!!
h = 6   # 7  - 1
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
objp = objp*24  # 24mm    注意改参数!!!!!棋盘格的每格的长度!

# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点

images = glob.glob('./Biaoding/*.jpg')  #   拍摄的十几张棋盘图片所在目录   需要改!!

i = 1
for fname in images:

    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        print("i:", i)
        i = i+1

        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w,h), corners, ret)
        cv2.namedWindow('findCorners', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('findCorners', 810, 405)
        cv2.imshow('findCorners',img)
        cv2.waitKey(500)
cv2.destroyAllWindows()
#%% 标定
ret, mtx, dist, rvecs, tvecs = \
    cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)


print("ret:",ret  )
print("mtx:\n",mtx)      # 内参数矩阵     需要!!
print("dist:\n",dist   )   # 畸变系数    需要!!
print("rvecs:\n",rvecs)   # 旋转向量  # 外参数
print("tvecs:\n",tvecs  )  # 平移向量  # 外参数

三、计算Aruco码的位姿

第一步计算出的相机的参数需要输入到第二步中,参数为内参mtx和畸变参数dist. 运行成功,会打开电脑摄像头,实时显示Aruco码的位姿。代码如下:

代码调用aruco包时经常显示没有这个包,No module named ‘aruco’,参考了很多文章,最后解决了,放在第四部分。

如果程序没有问题,可以实时计算显示Aruco码的位姿。


import numpy as np
import time
import cv2
import cv2.aruco as aruco

#相机内参
#mtx =
# [[1.22069150e+03 0.00000000e+00 6.61198100e+02]
# [0.00000000e+00 1.17618858e+03 2.81004495e+02]
#0    0    1

mtx = np.array([
        [1220.69,       0, 661.20],
        [      0, 1176.19, 281.00],
        [      0,       0,      1],
        ])

#相机畸变参数
#dist= [[-4.76531264e-02  8.98268556e-02  8.77978795e-04  1.08441766e-02  9.03702693e-01]]
dist = np.array( [-4.76531264e-02, 8.98268556e-02, 8.77978795e-04, 1.08441766e-02, 9.03702693e-01] )


#打开笔记本摄像头
cap = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX #font for displaying text (below)

#num = 0
while True:
    ret, frame = cap.read()
    # operations on the frame come here

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
    parameters =  aruco.DetectorParameters_create()

    '''
    detectMarkers(...)
        detectMarkers(image, dictionary[, corners[, ids[, parameters[, rejectedI
        mgPoints]]]]) -> corners, ids, rejectedImgPoints
    '''

    #lists of ids and the corners beloning to each id
    corners, ids, rejectedImgPoints = aruco.detectMarkers(gray,
                                                          aruco_dict,
                                                          parameters=parameters)

#    if ids != None:
    if ids is not None:

        rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, 0.05, mtx, dist)
        # Estimate pose of each marker and return the values rvet and tvec---different
        # from camera coeficcients
        (rvec-tvec).any() # get rid of that nasty numpy value array error

#        aruco.drawAxis(frame, mtx, dist, rvec, tvec, 0.1) #Draw Axis
#        aruco.drawDetectedMarkers(frame, corners) #Draw A square around the markers

        for i in range(rvec.shape[0]):
            aruco.drawAxis(frame, mtx, dist, rvec[i, :, :], tvec[i, :, :], 0.03)
            aruco.drawDetectedMarkers(frame, corners)
        #显示ID,rvec,tvec, 旋转向量和平移向量
        cv2.putText(frame, "Id: " + str(ids), (0,40), font, 0.5, (0, 0, 255),1,cv2.LINE_AA)
     #  cv2.putText(frame, "rvec: " + str(rvec[i, :, :]), (0, 60), font, 0.5, (0, 255, 0), 2, cv2.LINE_AA)
        cv2.putText(frame, "tvec: " + str(tvec[i, :, :]), (0,80), font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)


    else:
        ##### DRAW "NO IDS" #####
        cv2.putText(frame, "No Ids", (0,64), font, 1, (0,255,0),2,cv2.LINE_AA)

    # Display the resulting frame
    cv2.imshow("frame",frame)

    key = cv2.waitKey(1)

    if key == 27:         # 按esc键退出
        print('esc break...')
        cap.release()
        cv2.destroyAllWindows()
        break

    if key == ord(' '):   # 按空格键保存
#        num = num + 1
#        filename = "frames_%s.jpg" % num  # 保存一张图像
        filename = str(time.time())[:10] + ".jpg"
        cv2.imwrite(filename, frame)

四、导入Aruco包有问题

  1. 去cmd尝试卸载opencv-python 、opencv-contrib-python、
pip uninstall opencv-python
pip uninstall opencv-contrib-python
  1. 下载低版本的opencv-contrib-python==4.3.0.36, 从清华镜像下载,在cmd输入以下命令:
pip install opencv-python==4.3.0.36  -i https://pypi.tuna.tsinghua.edu.cn/simple

参考文献:
主要参考博客园的一篇文章,并进行改动,我使用了笔记本摄像头,而作者使用外接摄像头。
链接:博客园的Aruco代码

引用请声明:
https://blog.csdn.net/luckydong156/article/details/128712678

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用电脑摄像头计算aruco marker位姿(Python) 的相关文章

随机推荐

  • 智源青年科学家候选人 | 张祥雨:挑战自动化深度学习系统

    4月16日 xff0c 北京智源人工智能研究院发布 智源学者计划 xff0c 宣布重点支持四类人才 xff1a 智源科学家首席 xff08 CS xff09 智源研究项目经理 xff08 PM xff09 智源研究员 xff08 PI xf
  • 可导一定连续,连续不一定可导

    今天在群里面看到大家发了这句可导一定连续 xff0c 连续不一定可导 大家应该都很熟悉 xff0c 包括我自己 xff0c 但是真正理解有多少呢 xff0c 我当时就没想明白 xff0c 中午吃饭的时候也在想 xff0c 最后还是想明白了
  • PCA降维简介

    PCA 全称为 principal component analysis xff0c 即主成成分分析 xff0c 用于降维 对数据进行降维有很多原因 比如 xff1a 1 xff1a 使得数据更易显示 xff0c 更易懂 2 xff1a 降
  • 2014学习总结

    本来想将2014的总结推迟几天写的 xff0c 可是看到csdn的博客活动 xff0c 故而提前几天写了 http blog csdn net lu597203933 article details 18421101这是我个人2013写的学
  • 相似图片搜索原理一(ahash—c++实现)

    ahash xff0c 全称叫做 average hash 应该是 phash perceptual hash 感知哈希 算法的一种 是基于图像内容搜索最简单的一种 search image by image xff0c 因此也有很多的局限
  • BP算法与公式推导

    BP backpropgationalgorithm xff1a 后向传导算法 xff0c 顾名思义就是从神经网络的输出 顶层 到输入 底层 进行求解 那么求解什么呢 xff0c 求解的就是神经网络中的参数的导数 xff0c 即参数梯度方向
  • CNN公式推导

    CNN公式推导 1 前言 在看此blog之前 xff0c 请确保已经看懂我的前两篇blog 深度学习笔记1 卷积神经网络 和 BP算法与公式推导 并且已经看过文献 1 的论文 Notes on Convolutional Neural Ne
  • 简记ReNet

    ResNet 论文给出了Resnet有3中类型 xff0c ResNet50 res3 res4 res6 res3 xff0c ResNet101 res3 res4 res23 res3 和ResNet152 res3 res4 res
  • triplet loss的原理及caffe代码

    1 xff1a triplet loss的原理及梯度推到 http blog csdn net tangwei2014 article details 46788025 2 xff1a triplet loss如何增加到caffe中 xff
  • object detection资料汇总

    转自 xff1a https handong1587 github io deep learning 2015 10 09 object detection html Jump to LeaderboardPapers R CNNMulti
  • 离职小记~~~

    这个月作出的最重要的决定 离职 对于已工作的人来说 xff0c 离职就是跳槽 xff0c 特别是对于我们计算机专业 xff0c 简简单单的一封辞职信 xff0c 等个半月 xff0c 办完手续 xff0c 一切OK xff0c 而且貌似越跳
  • UC Berkeley 马毅:深度学习的第一性原理

    专栏 xff1a 研究思路 我们认为 xff0c 人工智能进入了新的拐点 在一个后深度学习时代 xff0c 不同的学者对未来智能发展道路的理解逐渐清晰 xff0c 当然也逐渐开始分化 xff0c 由此导致了开展布局完全不同的研究工作 智源社
  • 播放器插件实现系列 —— vlc

    vlc 是通过模块来扩展它的功能 xff0c 插件一般就是实现一个模块 vlc的模块有很多类型 xff1a AccessDemuxAccess DemuxDecoderInterfaceVideo filterAudio filterAud
  • 逻辑回归算法——经典的二分类算法

    一 概述 1 逻辑回归 xff08 Logistic Regression xff09 算法是分类算法 xff0c 而不是回归算法 2 决策边界 xff1a 可以是非线性的 xff08 高阶 xff09 二 sigmoid函数 1 定义 x
  • docker 部署redis 并设置密码

    安装docker docker pull redis 获取redis conf 从官网获取redis conf 修改默认配置文件 bind 127 0 0 1 注释掉这部分 xff0c 这是限制redis只能本地访问 protected m
  • 获取全文的13种方法

    注 xff1a 由于大部分院校未能购卖国内外商业医学数据库 xff0c 如 PUBMED ElseVier等 xff0c 因而检索国外全文文献很复杂 这往往成为少数学校的专利 北大医学院网站上有大量文献题录 xff0c 但仅供自已学生使用
  • PID调节(理论)

    AQ的PID相关资料 xff0c 我添加了些 机械控制工程基础 中的内容 什么是PID PID包括比例P xff0c 积分I xff0c 微分D控制器 使用PID控制器 xff0c 你需要以下6个基本元素 xff1a Error xff08
  • Mavlink协议

    Mavlink协议简介 Mavlink协议简介 一Mavlink协议二数据结构三协议支持的数据类型四性能五航点协议 读取MAV的航点列表写MAV的航点列表清除MAV的航点列表设置当前MAV航点 六参数的读写 读取参数列表读取单个参数写参数
  • 计算机图形学方向投稿国外期刊

    图形学领域的杂志 xff08 主要发表三维重构与可视化的一般理论方面的论文 xff09 对图形学领域的杂志 xff0c 国外一个专家有一个很好的评价 xff0c 我基本上按照其的意思翻译 xff0c 加上自己的一点理解 xff1a 1 顶级
  • 使用电脑摄像头计算aruco marker位姿(Python)

    一 效果图 刚做了一些尝试 xff0c 算两个aruco之间的距离 先算x方向 xff0c 用ID 61 12减去ID 61 13 xff0c tvec的三个坐标依次是Z Y X 所以 xff0c ID 61 12和ID 61 13的x距离