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

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

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板生成及位姿估计(Python实现)_第1张图片

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()

Aruco板生成及位姿估计(Python实现)_第2张图片

你可能感兴趣的:(位姿估计,ar,python,opencv)