Что я хочу сделать, это сопоставить систему линейных осей (координаты оси) с пикселями изображения на фотографии. Сначала я хочу откалибровать камеру с помощью сетки кругов, используя соответствующие координаты 2D-оси (трехмерная координата в плоскости z = 0). Это делается один раз, камера устойчива. Позже я хочу найти контуры в изображениях и получить их соответствующие координаты оси. В Python я использовал:opencv - Simple 2D <-> 2D-преобразование
ret, corners = cv2.findCirclesGrid(gray, (16,8))
imgpoints.append(corners)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
В объектах я поместил соответствующие координаты. Например.
objp[:,:2] = np.mgrid[0:16,0:8].T.reshape(-1,2)
objpoints.append(objp)
код более или менее из этого учебника: http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html
Я знаю, чем я могу использовать projectPoints, чтобы получить точку в оси координат пикселей изображения. Но я хотел бы сделать oposite и получить координату оси от пикселя изображения. Я много читал здесь о stackoverflow по этой теме, но я не нашел четкого ответа. Из-за недостатка я понял, что мне приходится искажать картинку и использовать solvePnP для получения координат камеры. Я должен признать, что я не понимаю, как интерпретировать эти шаги. Я не уверен, какое изображение должно быть неискаженным (моя сетка круга для калибровки или изображение, которое я обрабатываю позже) и как объединить его с solvePnP. Или даже возможно просто исказить точки контуров без искажения полного изображения? Я также не знаю, как получить позицию в качестве пикселя изображения из результата solvePnP. Кроме того, мне нужно передать не менее 4 баллов для решенияPnP, но я хочу преобразовать отдельные точки. Может быть, я понимаю что-то не так, и мне нужно сделать что-то совершенно другое. Буду признателен за вашу помощь.