Как они конвертировали пиксели IR-Lock в положение на нормальной плоскости на расстоянии 1 м от объектива? - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над отслеживанием движущейся цели с помощью Quadcopter.В моем проекте я использую ИК-камеру, которая является модифицированной версией камеры Pixy, но для обнаружения ИК-целей.Пока я изучал их код, я нашел часть, где я не мог этого понять.Я попытался найти его в Google, но не нашел ничего или формулы, связанной с этим.Поэтому мне интересно, может ли кто-нибудь дать мне несколько советов о том, какие уравнения или формулы они использовали.

Вот часть, которую я не понял.

/*
converts IRLOCK pixels to a position on a normal plane 1m in front of the lens based 
on a characterization of IR-LOCK with the standard lens, focused such that 2.38mm 
of threads are exposed 
*/
void AP_IRLock_I2C::pixel_to_1M_plane(float pix_x, float pix_y, float &ret_x, float &ret_y)
{
ret_x = (-0.00293875727162397f*pix_x + 0.470201163459835f)/
(4.43013552642296e-6f*((pix_x - 160.0f)*(pix_x - 160.0f)) 
+ 4.79331390531725e-6f*((pix_y - 100.0f)*(pix_y - 100.0f)) - 1.0f);
ret_y = (-0.003056843086277f*pix_y + 0.3056843086277f)/
(4.43013552642296e-6f*((pix_x - 160.0f)*(pix_x - 160.0f)) 
+ 4.79331390531725e-6f*((pix_y - 100.0f)*(pix_y - 100.0f)) - 1.0f);

Вы можете найти остальныекод здесь. IRlock Ardupilot

1 Ответ

0 голосов
/ 22 сентября 2018

Давайте сосредоточимся на уравнении для ret_x, которое упрощенно выглядит следующим образом:

ret_x = (-0.0029 * pix_x + 0.47) /
        (4.4e-6 * (pix_x - 160.0)^2 + 4.8e-6 * (pix_y - 100.0)^2 - 1.0);

Сначала обратите внимание на магические числа 160 и 100.Разрешение захвата Pixy составляет 320x200, поэтому они предназначены для перевода координат пикселя из пространства, где (0,0) находится в углу, где оно находится в центре.Таким образом, если pix_x равно 160, а pix_y равно 100, это центр кадра, а знаменатель будет равен -1.

Остальное представляется коррекцией объектива.Вот значения ret_x, которые вы получаете в диапазоне допустимых значений pix_x и pix_y:

        0      40      80     120    160     200     240     280     320
  0 -0.56   -0.40   -0.25   -0.12   0.00    0.12    0.25    0.40    0.56
 20 -0.55   -0.39   -0.25   -0.12   0.00    0.12    0.25    0.39    0.55
 40 -0.54   -0.38   -0.25   -0.12   0.00    0.12    0.25    0.38    0.54
 60 -0.53   -0.38   -0.24   -0.12   0.00    0.12    0.24    0.38    0.53
 80 -0.53   -0.38   -0.24   -0.12   0.00    0.12    0.24    0.38    0.53
100 -0.53   -0.38   -0.24   -0.12   0.00    0.12    0.24    0.38    0.53
120 -0.53   -0.38   -0.24   -0.12   0.00    0.12    0.24    0.38    0.53
140 -0.53   -0.38   -0.24   -0.12   0.00    0.12    0.24    0.38    0.53
160 -0.54   -0.38   -0.25   -0.12   0.00    0.12    0.25    0.38    0.54
180 -0.55   -0.39   -0.25   -0.12   0.00    0.12    0.25    0.39    0.55
200 -0.56   -0.40   -0.25   -0.12   0.00    0.12    0.25    0.40    0.56

Таким образом, как и ожидалось, ret_x близко к 0 для пикселей около центра (pix_x == 160).И оно достигает +/- 0,56 в крайних точках, что предполагает горизонтальное поле зрения приблизительно в 120 градусов (из тригонометрии, ширина 2 * 0,56 метра на расстоянии 1 метр).

Горизонтальная коррекция слегка зависит отвертикальная координата, особенно вблизи углов.Это, по-видимому, исправляет сферические искажения в линзе (что является обычным явлением).

Проницательный признает, что уравнение слегка дефектно: учитывая координаты пикселей в [0,319] и [0,199], значения центра должныбыть 159,5 и 99,5, а не 160 и 100.

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