Нужно найти гомографию от Kinect до Projector с изменениями по оси Z - PullRequest
0 голосов
/ 31 октября 2019

Я хочу использовать Kinect для определения местоположения человека в кадре, а затем проецировать на него. Проблема, с которой я сталкиваюсь, заключается в учете разницы в перспективах между Kinect и проектором. Прямо сейчас я использую функцию findChessBoardCorners в OpenCV, чтобы находить точки от проекторов POV и Kinect. Это выглядит так:

ret, cornersproj = cv2.findChessboardCorners(pattern_border, (9,6), None)
cv2.namedWindow("test", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("test", cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
cv2.imshow('test', pattern_border)
cv2.waitKey(1)

retkct = False

while not retkct:
    color_frame = kinect.get_last_color_frame()
    color_img = color_frame.reshape(((color_height, color_width, 4))).astype(np.uint8)
    align_color_img  = get_align_color_image(kinect, color_img)
    retkct, cornerskct = cv2.findChessboardCorners(align_color_img, (9,6), None)

print('found')

cv2.destroyAllWindows()

h, status = cv2.findHomography(cornerskct, cornersproj)

Я знаю, что это грязно - я собираюсь заставить все работать, прежде чем я сделаю код "красивым".

Затем я просто использую warpPerspectiveФункция с вычисленной матрицей гомографии h.

warped = cv2.warpPerspective(image, h, res)

Где res - кортеж с разрешением проектора.

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

...