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

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

/*
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

0
Mohamed Rabah 22 Сен 2018 в 08:41

1 ответ

Лучший ответ

Давайте сосредоточимся на уравнении для 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.

2
John Zwinck 22 Сен 2018 в 06:36