Для получения реальной точности вам необходимо откалибровать камеру. Последующего достаточно для первого приближения.
На изображении ниже изображено (Xi, Yi) и камера (Xc, Yc, Zc) системы координат, которые я буду использовать в этом ответе - они используются OpenCV. Он также показывает две точки изображения p1 и p2 , которые могут быть границами изображения вашего объекта интереса, и соответствующие лучи r1 и r2 проецирование их в центр камеры.
Во-первых, давайте конвертируем ваш фокусный объектив в пиксели, чтобы упростить вычисления. При шаге точки 4,8 мкм ширина вашего датчика составляет 4,8 * 1280 мкм = 6,14 мм. Так, пропорционально, f_pix: 8 мм = 1280 пикселей: 6,14 мм, следовательно, f_pix = 1667 пикселей. Теперь мы можем написать простейшую матрицу камеры-обскуры, которая предполагает, что фокусная ось камеры ортогональна изображению, и пересекает ее в центре изображения. В записи Нумпи:
K = np.array([[1667, 0, 640], [0, 1667, 512], [0, 0, 1]])
С учетом этой матрицы и любой трехмерной точки P = (X, Y, Z) * 1026 * в координатах камеры, координаты изображения (x, y) его проекции на изображение вычисляются как:
p = K.dot(P)
x, y = p[0]/p[2], p[1]/p[2]
И наоборот, для пары координат пикселей (x, y) трехмерный луч r обратного проецирования этого пикселя в трехмерное пространство определяется как:
Ki = np.linalg.inv(K)
r = Ki.dot([x, y, 1.0])
Это «луч» в том смысле, что все трехмерные точки R = s * r , полученные умножением его на произвольное число s , будут лежать на одной и той же линия, проходящая через центр камеры и пиксель (x, y) .
Поэтому, учитывая ваши граничные точки изображения p1 = (x1, y1) и p2 = (x2, y2) , вы можете вычислить, как указано выше лучей r1 и r2 возвращают их в трехмерное пространство. Угол между ними легко вычисляется по формуле точечного произведения:
cos_angle = r1.dot(r2) / (np.linalg.norm(r1) * np.linalg.norm(r2))
angle_radians = np.acos(cos_angle)
Повторюсь, приведенные выше формулы являются лишь первым приближением. Реальная камера будет иметь некоторое нелинейное искажение линзы, которое вам нужно будет исправить, чтобы получить точные результаты, и будет иметь немного децентрированную ось фокусировки относительно изображения. Все эти проблемы решаются путем калибровки камеры.