OpenCV: вычислить угол между камерой и объектом - PullRequest
0 голосов
/ 09 марта 2019

как я могу вычислить угол объекта перед моей камерой? Разрешение моей камеры составляет 1280x1024, фокусное расстояние моего объектива составляет 8 мм, а размер каждого пикселя на CMOS составляет 4,8 микрометра. Конечно, должно быть возможно вычислить угол от этого. Также я вычислил расстояние от объекта до камеры, и все на одном уровне. Так что интересна только координата X, верно?

Я использую OpenCV и Python для обработки.

Моя идея состояла в том, чтобы использовать фокусное расстояние объектива в сочетании с смещением X обнаруженного объекта от середины датчика, но я получаю странные углы от этого.

Это код для оценки угла:

первая координата точки X, вторая ширина всего датчика (1280 пикселей * 4,8 мкм) в мм, третье фокусное расстояние в мм.

angle = (pointInterpolatedX * 6.144) / 8

Может ли кто-нибудь помочь мне здесь? Спасибо!

Кроме того, я смотрел на эту тему здесь , но я не совсем понимаю это. У меня есть намного больше информации о моей камере, а также мой объект может двигаться только в 2 измерениях, а не в трех. Так что может быть умный способ оценить его положение на земле перед камерой. Есть ли в OpenCV какие-либо функции, которые я мог бы использовать для этого?

Ответы [ 2 ]

3 голосов
/ 10 марта 2019

Для получения реальной точности вам необходимо откалибровать камеру. Последующего достаточно для первого приближения.

На изображении ниже изображено (Xi, Yi) и камера (Xc, Yc, Zc) системы координат, которые я буду использовать в этом ответе - они используются OpenCV. Он также показывает две точки изображения p1 и p2 , которые могут быть границами изображения вашего объекта интереса, и соответствующие лучи r1 и r2 проецирование их в центр камеры.

Image axes

Во-первых, давайте конвертируем ваш фокусный объектив в пиксели, чтобы упростить вычисления. При шаге точки 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)

Повторюсь, приведенные выше формулы являются лишь первым приближением. Реальная камера будет иметь некоторое нелинейное искажение линзы, которое вам нужно будет исправить, чтобы получить точные результаты, и будет иметь немного децентрированную ось фокусировки относительно изображения. Все эти проблемы решаются путем калибровки камеры.

0 голосов
/ 09 марта 2019

нет, вам нужно знать угол обзора вашей камеры, возьмите транспортир и убедитесь, что вы можете использовать что-то вроде этого

x,y=my_coordinates
angle_per_pix=my_cam_angle/1280
angle_vertical=(x-640)*angle_per_pix #-640 beacuse you want angle between middle of camera
angle_horizontal=(x-512)*angle_per_pix

пример для my_cam_angle:

cam view

angle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...