1

我正在尝试检测 ArUco 标记以识别一些真实的移动物体,以撰写我的学位论文。首先,我尝试了一些 4x4 ArUco Markers,我得到了很好的结果,然后我尝试了从我的相机获得的图像。此图像包含 5x5 ArUco 标记,应用相同的代码,除了更改字典,每 5x5 4x4,为什么只检测 4x4 标记?

结果:检测到 4x4 标记1

未检测到 5x5 标记2

import cv2
import numpy as np
from cv2 import aruco
import camera_calibration

path='/home/alejandrocruzado/Documents/Imaginni/aruco4.png'
path_5 = '/home/alejandrocruzado/Documents/Imaginni/aruco5.jpg'
path5x5 = '/home/alejandrocruzado/Documents/Imaginni/5x5.jpg'
distCoeffs=[0.0189223469433419, -0.0206788674793396,0.003225513523750, 0.001510000668961]
cameraMatrix=[[600.8293, 0, 330.2756],[0, 601.3519, 225.9791],[0, 0, 1.0000]]

def MarkerDetection4x4(path):
    img = cv2.imread(path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    aruco_dict = cv2.aruco_Dictionary.get(aruco.DICT_4X4_1000)
    parameters = cv2.aruco_DetectorParameters.create()
    corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
    cv2.aruco.drawDetectedMarkers(img,corners,ids,)
    cv2.imshow('Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    rvecs, tvecs, _objPoints = cv2.aruco.estimatePoseSingleMarkers(corners, 0.045, cameraMatrix, distCoeffs)
    cv2.aruco.drawAxis(img, cameraMatrix, distCoeff, rvecs, tvecs, 0.1)


def MarkerDetection5x5(path):
    img = cv2.imread(path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    
    aruco_dict = cv2.aruco_Dictionary.get(aruco.DICT_5X5_250)
    parameters = cv2.aruco_DetectorParameters.create()
    corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
    cv2.aruco.drawDetectedMarkers(img,corners,ids,)
    cv2.imshow('Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    rvecs, tvecs, _objPoints = cv2.aruco.estimatePoseSingleMarkers(corners, 0.045, cameraMatrix, distCoeffs)
    cv2.aruco.drawAxis(img, cameraMatrix, distCoeff, rvecs, tvecs, 0.1)


if __name__ == "__main__":

    #MarkerDetection4x4(path)
    MarkerDetection5x5(path5x5)

谢谢

4

1 回答 1

1

您可以使用以下代码在被拒绝的标记候选者周围画线:

for rejected in rejected_img_points:
     rejected = rejected.reshape((4, 2))
     cv2.line(img, tuple(rejected[0]), tuple(rejected[1]), (0, 0, 255), thickness=2)
     cv2.line(img, tuple(rejected[1]), tuple(rejected[2]), (0, 0, 255), thickness=2)
     cv2.line(img, tuple(rejected[2]), tuple(rejected[3]), (0, 0, 255), thickness=2)
     cv2.line(img, tuple(rejected[3]), tuple(rejected[0]), (0, 0, 255), thickness=2)

如果您看到标记图像被正确检测但被拒绝,那么您可能正在使用与用于绘制这些标记的字典不同的字典进行检测。标记字典已更改。

使用以下代码创建一组新的 5x5 标记,然后重试:

marker_id = 5
# The image size for marker should be a 
# multiple of (number of bits + 2 * border) or 
# very large compared to number of bits  
marker_size = 140   
marker_dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_5X5_50)
marker_imge = np.zeros((marker_size, marker_size), np.uint8)
marker_img = cv2.aruco.drawMarker(marker_dictionary, marker_id, marker_size, marker_img, 1)
于 2018-10-26T15:26:32.300 回答