Я хочу использовать 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-пространстве искажают проекцию. Как я могу объяснить это? Я принимаю совершенно неправильный подход? Любые ответы будут оценены.