как получить омографию от изображения чаруко? - PullRequest
0 голосов
/ 02 августа 2020

хотя я создал отчет об ошибке, я хотел бы обсудить возможное решение этой проблемы: https://github.com/opencv/opencv_contrib/issues/2604

Я загрузил доску charuco с calib.io и распечатал ее и взял изображение:

img1: изображение камеры платы charuco 8x11 DICT_4x4

позже я сам воссоздал эту доску charuco с opencv:

img2: charuco baord

для нахождения гомографии необходим только набор соответствующих точек на этих двух изображениях, а углы чаруко (шахматные корни), как я подумал, должны быть этими соответствующими точками. И применение гомографии к изображению камеры (img1) должно дать неисторированное изображение (img2), но результат переворачивается вокруг горизонтальной линии (img3).

img3: неисторированное изображение с камеры платы charuco - но перевернуто

проблема: похоже, что порядок точек из функции создания доски не совпадает с порядком функции обнаружения доски. Итак, эти точки не совпадают.

Я попытался спроецировать углы от object-cs к camera-cs, но это тоже не сработало, потому что cv2.aruco.calibrateCameraCharuco также использует эти несоответствующие точки. И поэтому каждая матрица камеры, созданная с помощью charuco, должна иметь эту проблему, и поэтому я не могу поверить, что никто не сталкивался с этой проблемой до меня. Вот почему я не уверен, действительно ли это ошибка или неправильная концепция с моей стороны.

Я также пытался решить проблему, изменив функцию создания доски, но это оказалось непростой задачей . Я изменил порядок углов маркеров чаро, чтобы они начинались в верхнем левом углу с 1, но затем маркеры рисуются в обратном направлении, что приводит к тому же неверному результату.

Для воспроизведения:

import cv2

img_cam1_board_ref_c = cv2.imread('img1')
aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_4X4_50)
board = cv2.aruco.CharucoBoard_create(11, 8, 40, 30, aruco_dict)
img_board = board.draw((40*11, 40*8), marginSize=0, borderBits=1)
cv2.imwrite("images\charuco_board_11x8.tiff", img_board)
cv2.imshow('img_board', img_board)

parameters = cv2.aruco.DetectorParameters_create()

all_marker_corners_c = []
all_marker_ids = []

all_chessboard_corners_c = []
all_chessboard_ids_c = []
rejectedImgPoints = []
counter = []
i = 0

# SUB PIXEL CORNER DETECTION CRITERION
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.00001)

img_gray = cv2.cvtColor(img_cam1_board_ref_c, cv2.COLOR_BGR2GRAY)
cv2.imshow('camera_image', img_gray)

marker_corners_c, marker_ids, img_rejectedImgPoints = cv2.aruco.detectMarkers(img_cam1_board_ref_c, aruco_dict, parameters=parameters)
print(marker_corners_c, marker_ids, img_rejectedImgPoints)

for marker_corner in marker_corners_c:
    cv2.cornerSubPix(img_gray, marker_corner,
                     winSize=(3, 3),
                     zeroZone=(-1, -1),
                     criteria=criteria)
[retval, chessboard_corners_c, chessboard_ids_c] = cv2.aruco.interpolateCornersCharuco(marker_corners_c, marker_ids, img_gray, board) #retval, charucoCorners, charucoIds

chessboard_corners_o = board.chessboardCorners

H1_c_o, mask_c_o = cv2.findHomography(chessboard_corners_c, chessboard_corners_o) # src, dest
img_cam1_board_ref_o = cv2.warpPerspective(img_cam1_board_ref_c, H1_c_o, (600, 800))

cv2.imshow('img_cam1_board_ref_o', img_cam1_board_ref_o)
cv2.waitKey(0)
...