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

这篇具有很好参考价值的文章主要介绍了使用电脑摄像头计算aruco marker位姿(Python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、效果图

刚做了一些尝试,算两个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. 有误差

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

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

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

ID=13

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

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文章来源地址https://www.toymoban.com/news/detail-455502.html

到了这里,关于使用电脑摄像头计算aruco marker位姿(Python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用手机作为电脑的麦克风和摄像头外设

    Iriun 电脑端安装:Iriun Android: Iriun 4K Webcam for PC and Mac - Apps on Google Play Apple: Iriun Webcam for PC and Mac on the App Store 基础功能免费,普通使用足够了。 付费功能: 这里有介绍: 手机相机作为电脑摄像头使用(Android、iPhone) - Bandicam(班迪录屏) 手机和电脑在同一个局域网中就可以

    2024年02月01日
    浏览(67)
  • 使用HTML5技术控制电脑或手机上的摄像头

    理想情况下我们应该先判断你的设备上是否 有摄像头或相机,但简单起见,我们在这里直接 写出了HTML标记,而不是用JavaScript先判断 然后动态生成这些标记 – Snap Photo 在写出上面这些标记前应该判断用户的客户端是否有摄像头支持,但这里为了不那么麻烦,这里直接写出了

    2024年04月16日
    浏览(55)
  • 新手小白如何快速使用家用电脑远程访问摄像头【内网穿透】

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《高质量编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 在现代生活中,很多场景都会用到监控设备,但也不是所有场景都需要用到专业且昂贵的监控报警系统,更多的场景只是简单的在家用电脑中连接一个摄像头,进行简

    2024年02月13日
    浏览(52)
  • 怎么让电脑上的摄像头无绿幕使用背景虚化/虚拟背景、视频无绿幕使用背景虚化、虚拟摄像头无绿幕背景虚化

    参考: https://github.com/aisegmentcn/aisegment_obs_plugin https://obsproject.com/forum/resources/virtual-background-by-aisegment.1546/ 腾讯会议中是可以使用虚拟背景的,但是其他视频会议软件没有,那怎么办 1. 下载OBS 打开steam,搜索OBS,我成功的这个OBS版本为30.0.2 2. 下载OBS AI虚拟背景插件 https://git

    2024年04月26日
    浏览(43)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(58)
  • 使用HTML5技术控制电脑或手机上的摄像头,快来收藏

    理想情况下我们应该先判断你的设备上是否 有摄像头或相机,但简单起见,我们在这里直接 写出了HTML标记,而不是用JavaScript先判断 然后动态生成这些标记 – Snap Photo 在写出上面这些标记前应该判断用户的客户端是否有摄像头支持,但这里为了不那么麻烦,这里直接写出了

    2024年04月10日
    浏览(50)
  • [Unity/AR]使用vuforia开发项目时无法调用电脑前置摄像头怎么办?

    我当时试了一万种方法,经过无数漫长黑夜的折磨 我发现,就是装unity的时候加了中文路径。。。 有可能还会提示DATABASES _LOAD_ERROR  也是中文路径的问题  谨以此文警醒自己 所有和uniyy相关的东西都不要放在中文路径!!!

    2024年02月07日
    浏览(48)
  • 【计算机视觉 · OpenCV】使用 OpenCV 调用手机摄像头

    Droidcam 是一款可以将手机变成网络摄像头的工具,我们可以利用 Droidcam 让 OpenCV 拥有调用手机摄像头的能力。 2.1 安装 DroidCam 在手机和电脑上分别安装 DroidCam 的客户端和服务端 下载地址:https://pan.baidu.com/s/1DrBn3P1Bx-SXa4d6oziifA?pwd=gr1o 提取码:gr1o 2.2 测试连接状态 手机和电脑需

    2024年02月09日
    浏览(52)
  • 电脑微信视频摄像头怎么打开 微信视频聊天怎么打开电脑摄像头

    最近有用户在使用电脑微信视频聊天的时候,不知道怎么打开电脑摄像头的权限,今天小编就给大家带来了微信视频聊天打开电脑摄像头的具体方法。无论你是台式电脑还是联想、戴尔、华硕、华为等品牌都可以使用本文的方法,有需要的用户们赶紧来看一下吧。 电脑微信视

    2024年02月06日
    浏览(51)
  • 电脑上虚拟摄像头在哪关闭?多种方法关闭虚拟摄像头

    在数字化时代,虚拟摄像头成为了许多工作和娱乐场景中的必备工具。它允许我们在不使用物理摄像头的情况下,通过软件模拟摄像头功能,从而满足视频通话、直播、教学等多种需求。 然而,有时我们可能需要在某些情况下关闭虚拟摄像头,那么,电脑上虚拟摄像头应该在

    2024年04月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包