OpenCV: рассчитать угол между камерой и пикселем

Я хотел бы знать, как я могу рассчитать угол пикселя на фотографии относительно веб-камеры, которую я использую. Я новичок в этом, и я использую веб-камеру. По сути, я делаю фотографию, обрабатываю ее, и в итоге я получаю значение пикселя в изображении, которое я ищу. Затем мне нужно каким-то образом превратить это значение в какое-то значимое количество --- мне нужно найти строку/вектор, который проходит через пиксель и камеру. Мне не нужна величина, просто фаза.

Как это можно сделать? Требуется ли калибровка камеры? Я немного читал об этом, но не уверен.

Спасибо

Ответ 1

Вам не нужно знать расстояние до объекта, только разрешение и угол обзора камеры.

Для вычисления угла требуется только простая линейная интерполяция. Например, допустим, камера с разрешением 1920x1080, которая охватывает угол обзора 45 градусов по диагонали.

В этом случае sqrt (1920 2 + 1080 2) дает 2292,19 пикселей по диагонали. Это означает, что каждый пиксель представляет 45/2292.19 =.0153994 градусов.

Итак, вычислите расстояние от центра (в пикселях), умножьте на .0153994, и у вас есть угол от центра (для этой камеры - для вашего, вам, очевидно, придется использовать свое разрешение и угол вид).

Конечно, это несколько приблизительное - его точность будет зависеть от того, насколько сильно искажается объектив. При использовании зум-объектива (особенно широкий угол) вы можете рассчитывать на достаточно высокий уровень. С фиксированным фокусным расстоянием объектив (особенно если он не охватывает угол более 90 градусов или около того), он обычно будет довольно низким.

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

Ответ 2

Рецепт:

1 - Откалибруйте камеру, получив матрицу камеры K и параметры искажения D. В OpenCV это выполняется, как описано в этом tutorial.

2 - Удалите нелинейное искажение из интересующих пиксельных позиций. В OpenCV выполняется с помощью undistortPoints, не передавая аргументы R и P.

3 - Обратно спроектируйте интересующие пиксели в лучах (единичные векторы с хвостом в центре камеры) в 3D-координатах камеры, умножив их положения пикселей в однородных координатах на обратную сторону матрицы камеры.

4 - нужный угол - это угол между указанными выше векторами и (0, 0, 1), вектор, связанный с фокальной осью камеры.