下边的代码仅从结构上给出示意,如果想要使用还需要弄明白参数的设置,否则识别效果可能很差
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()