Предположим, у меня есть камера, которая была откалибрована с использованием полного кадра камеры для получения матрицы камеры и коэффициентов искажения. Также предположим, что у меня есть трехмерная мировая точка, выраженная в кадре этой камеры.
Я знаю, что могу использовать cv::projectPoints()
с rvec=tvec=(0,0,0)
, матрицей камеры и коэффициентами искажения для проецирования точки на ( полный) искаженный кадр. Я также знаю, что если я получаю ROI от камеры (которая представляет собой обрезанную часть полностью искаженного кадра), я могу отрегулировать ROI, просто вычитая координату (x,y)
верхнего левого угла ROI из результат cv::projectPoints()
. Наконец, я знаю, что если я использую cv::projectPoints()
с rvec=tvec=(0,0,0)
, матрицей камеры и нулевыми коэффициентами искажения, я могу проецировать точку на полный неискаженный кадр (поправьте меня, если я ошибаюсь, но я думаю, что для этого требуется, чтобы вы использовать ту же матрицу камеры в cv::undistort()
и не использовать newCameraMatrix
).
Как мне справиться со случаем, когда я хочу проецировать на неискаженную версию получаемой мной ROI (т. е. Я получаю (искаженную) ROI, а затем использую cv::undistort()
на нем, используя метод, описанный здесь , чтобы учесть тот факт, что это ROI, а затем я хочу спроецировать 3D-точку на полученное изображение) ?
Если есть лучший способ go обо всем этом, я также открыт для предложений. Моя цель состоит в том, чтобы иметь возможность проецировать 3D-точки на искаженные и неискаженные кадры с или без наличия ROI, где ROI всегда изначально определяется потоком с камеры и, следовательно, всегда определяется в искаженном кадре (т.е. различные случаи: искаженный полный кадр, искаженный ROI, неискаженный полный кадр, неискаженная версия искаженного ROI).