Рисование осей позы ArUco в неправильном месте - PullRequest
0 голосов
/ 24 сентября 2019

Я работаю над проектом обработки изображений, который обнаруживает маркеры ArUco и что-то делаю в соответствии с ними.Когда на видео или изображении присутствует только один маркер, все работает нормально, но когда я ставлю другой маркер, поза (оси) второго маркера ArUco печатается не в том месте, а не в центре маркера.Пожалуйста, смотрите скриншот, которым я поделился, для лучшего понимания.

Маркер с идентификатором [2] в порядке.Оси позы тянутся к центру маркера.Но ось позы маркера с идентификатором 1 обращается к некоторой случайной точке.

co

Вот часть кода, которая обнаруживаетArUco отмечает и рисует ось.

while True:
    ret, frame = cap.read()

    # Operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # Change grayscale
    aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_250)  # Specify marker size as 4x4, 5x5, 6x6
    parameters = aruco.DetectorParameters_create()  # Marker detection parameters
    # Lists of ids and the corners beloning to each marker
    corners, ids, rejected_img_points = aruco.detectMarkers(gray, aruco_dict,
                                                            parameters=parameters,
                                                            cameraMatrix=matrix_coefficients,
                                                            distCoeff=distortion_coefficients)

    try:    
        if np.all(ids is not None):  # If there are markers found by detector
            for i in range(0, len(ids)):  # Iterate in markers
                # Estimate pose of each marker and return the values rvec and tvec---different from camera coefficients
                rvec, tvec, markerPoints = aruco.estimatePoseSingleMarkers(corners[i], 0.02, matrix_coefficients,
                                                                           distortion_coefficients)
                (rvec - tvec).any()  # get rid of that nasty numpy value array error
                aruco.drawDetectedMarkers(frame, corners)  # Draw A square around the markers
                aruco.drawAxis(frame, matrix_coefficients, distortion_coefficients, rvec, tvec, 0.01)  # Draw axis

                c_x = (corners[i][0][0][0] + corners[i][0][1][0] + corners[i][0][2][0] + corners[i][0][3][0]) / 4 # X coordinate of marker's center
                c_y = (corners[i][0][0][1] + corners[i][0][1][1] + corners[i][0][2][1] + corners[i][0][3][1]) / 4 # Y coordinate of marker's center
                cv2.putText(frame, "id"+str(ids[i]), (int(c_x), int(c_y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (50,225,250), 2)

    except:
        if ids is None or len(ids) == 0:
            print("******************************************************")
            print("*************** Marker Detection Failed **************")
            print("******************************************************")
...