我正在使用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
答案 0 :(得分:2)
我们将重点放在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
中心附近的像素,pix_x == 160
接近于0。并且在极端情况下达到+/- 0.56,这表明水平视场约为120度(从三角学出发,在1米距离处的宽度为2 * 0.56米)。
水平校正受垂直坐标的影响很小,尤其是在拐角附近。据推测,这是为了校正镜头中的球面畸变(这很常见)。
精明的人会意识到该方程式稍有缺陷:给定[0,319]和[0,199]中的像素坐标,中心值应为159.5和99.5,而不是160和100。