Aruco板生成及位姿估计(Python实现)

本文介绍了如何使用OpenCV库生成Aruco棋盘,并演示了如何通过Aruco技术进行位姿估计。首先,我们学习如何创建一个5x7的棋盘并保存为图片,接着讲解了如何在实时视频中检测和估计棋盘的坐标。关键步骤包括检测标记、估计板子位置和绘制辅助线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下边的代码仅从结构上给出示意,如果想要使用还需要弄明白参数的设置,否则识别效果可能很差

opencv对应函数说明:https://docs.opencv.org/master/de/d05/classcv_1_1aruco_1_1GridBoard.html

Aruco板生成代码

import cv2 
import numpy as np


markersX = 2           #X轴上标记的数量
markersY = 6            #EY轴上标记的数量   本例生成5x7的棋盘
markerLength = 100#标记的长度,单位是像素
markerSeparation = 20#每个标记之间的间隔,单位像素
margins = markerSeparation #标记与边界之间的间隔
borderBits = 10 #标记的边界所占的bit位数
showImage = True 


width = markersX * (markerLength + markerSeparation) - markerSeparation + 2 * margins 
height =markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins 


dictionary = cv2.aruco.Dictionary_get( cv2.aruco.DICT_6X6_250)
board = cv2.aruco.GridBoard_create(markersX, markersY, float(markerLength),float(markerSeparation), dictionary) 
print(cv2.aruco_GridBoard.getGridSize(board))
img= cv2.aruco_GridBoard.draw(board,(5000,6000),1) 
cv2.imwrite('frame.png', img)

在这里插入图片描述

Aruco板位姿估计代码

import cv2 as cv
import numpy as np

vid = cv.VideoCapture(0) 
def mainFunc():
   
    cameraMatrix= np.array([[536.0867309570312, 0, 321.54229736328125],
                                    [0, 536.0867309570312, 228.008056640625],
                                    [0., 0., 1.0]], np.float32)
    distCoeffs  = np.array( [-0.08680019  ,0.25127951, -0.01176   , -0.00510538 ,-0.16304792])
    markerDict = cv.aruco.getPredefinedDictionary(cv.aruco.DICT_6X6_250)
    board = cv.aruco.GridBoard_create(4,4, 0.04,0.01, markerDict)
    rvec = None
    tvec = None
    while(True):
        # get frame from camera
        #ret, inputImg = vid.read() 
        inputImg=cv.imread('arucoboard.png')
        gray = cv.cvtColor(inputImg, cv.COLOR_BGR2GRAY)
        # detect markers
        corners, ids, reject = cv.aruco.detectMarkers(gray, markerDict, cameraMatrix=cameraMatrix, distCoeff=distCoeffs)
        # if at least one marker detected
        if (len(corners) > 0) and (len(ids) > 0):
            success, rvec, tvec = cv.aruco.estimatePoseBoard(corners, ids, board, cameraMatrix, distCoeffs, rvec, tvec)
            if success > 0:
                gray = cv.aruco.drawAxis(inputImg, cameraMatrix, distCoeffs, rvec, tvec, 0.1)
            cv.aruco.drawDetectedMarkers(inputImg, corners,ids)
        cv.imshow('frame', inputImg)
        #print(gray.shape)
        cv.waitKey(1)

if __name__ == "__main__":
    mainFunc()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值