This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:LDC 调优

Guru**** 1997655 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1017490/tda4vm-ldc-tuning

器件型号:TDA4VM

我想获得一些有关 LDC 调优的支持。 如何 使用 LDC LUT 获得更好的失真校正。

输入图像尺寸为1280x960、 输出图像尺寸相同。 我想使用 LDC LUT 执行失真校正。

我已  3μm 透镜供应商提供失真功能,即 HFOV > 190°,VFOV > 135°,焦距= 0.89mm,传感器像素大小=μ m。  我使用以下脚本生成了网格 LUT 文件。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function ldc
gen_lut('/home/vvn/Documents/ldc_spec.txt', 3/1000, 1.78, 1280, 960, 640, 480, 4, 2);
end
% read the distortion specification table(angle and height)
function lut = read_spec(spec_file, pitch_in_mm)
lut0 = dlmread(spec_file);
theta = lut0(:,1)/180*pi;
lut = [theta, lut0(:,2)/pitch_in_mm];
end
% back map
function [h_d, v_d] = xyz2distorted(x, y, z, hc, vc, spec_file, pitch_in_mm)
xt = x-hc; yt = y-vc; zt = z*ones(size(xt));
[phi, r] = cart2pol(xt, yt);
theta = atan2(r, zt);
lut = read_spec(spec_file, pitch_in_mm);
r_d = interp1(lut(:,1), lut(:,2), theta);
[h_d, v_d] = pol2cart(phi, r_d);
h_d = h_d + hc; v_d = v_d + vc;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

原始图像:

然后、我将网格 LUT 文件导入到 DCC 工具中、并使用 DCC 工具生成 LDC 表。

DCC 设置:

但我发现输出图像太差。

输出图像:

在此感谢您的指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    镜头 vendorse2e.ti.com/.../ldc_5F00_spec.txt 中的失真函数

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     大多数线在校正后是直线。
    所以、失真校正对我来说是合理的。

    图表上的某些线条看起来是弯曲的,但可能是因为纸张不够平坦。
    供应商 LUT 通常足够准确、但有时图像中心和焦距可能与标称值不同、因为使用的是特定摄像头。

    您的参数主要是正确的:

    >> gen_LUT ('/home/vvn/Documents/ldc_spec.txt、3/1000、1.78、1280、960、 640、480、4、2);
    焦距为"0.89"而不是1.78 (但它与 s 一起工作),因此相当于 f=0.89,s=4。
    -"m=2"太小:通常使用"m=3"或"m=4"来减小 LUT 大小。

    -如果您需要进一步改进失真校正,您可以验证(640、480)的图像中心是否足够准确
    -如果您需要进一步改进失真校正、您可以验证 f=0.89是否足够准确地用于您的摄像机。

    -您在 GUI 上使用了"Bicubic"、但它将 LDC 吞吐量降低了一半(典型情况是使用了"Bilinear")。

    输入 JPG 图像的边缘周围有很多伪影(可能来自边缘增强或 JPG 压缩)。
    输出图像也有一些边沿伪影。
    您可以先关闭边沿增强功能以进行调试/测试失真校正。
    然后、重新调整边缘增强以获得最佳图像质量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢!

    然后、我按下"export DCC profile binary"按钮来生成 LDC LUT 表。 我在 XML 文件夹中找到了 LDC LUT 标签的文件。

     assamplesensor_mesh_LUT:

    我 使用    assamplesensor_mesh_LUT 文件生成了 LDC_LUT 的新头文件、如下所示:

    但是、我编译了视觉应用程序、但发生了错误。

    我现在该怎么办?我是否得到 了错误的 LDC LUT 表?

    在此感谢您的指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    导出的 xml 文件用于"imaging/sensor_drv/src/imx390/DCC_XMLS/WDR/"等文件夹下的 DCC 设置。
    它在 DCC 的"uint16"中。

    您使用的是"uint8"、因此会出现编译器错误。
    您需要将数字从"uint16"更改为"uint8": 0x063d -> 0x3D、0x06。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢!

    我可以使用 LDC 获得非失真图像,现在我想  获得非失真 图像和鸟瞰图像 。

    我使用  了 OpenCV 的 getPerspectiveTransform。对象指向:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    objectPoints[0].x = 565;
    objectPoints[0].y = 390;
    objectPoints[1].x = 715;
    objectPoints[1].y = 390;
    objectPoints[2].x = 565;
    objectPoints[2].y = 570;
    objectPoints[3].x = 715;
    objectPoints[3].y = 570;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    我尝试从鱼眼图像获取图像点,并生成仿射矩阵。  
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    imagePoints[0].x = 571;
    imagePoints[0].y = 525;
    imagePoints[1].x = 698;
    imagePoints[1].y = 525;
    imagePoints[2].x = 518;
    imagePoints[2].y = 643;
    imagePoints[3].x = 748;
    imagePoints[3].y = 640;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    并在 DCC 工具中设置值、但出现了问题。   
    当我使用 来自非失真图像的图像点时、DCC 工具也出现了问题。
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    imagePoints[0].x = 607;
    imagePoints[0].y = 504;
    imagePoints[1].x = 670;
    imagePoints[1].y = 504;
    imagePoints[2].x = 573;
    imagePoints[2].y = 572;
    imagePoints[3].x = 699;
    imagePoints[3].y = 568;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在此感谢您的指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    错误消息显示块大小太大、网格下采样太小。

    您必须降低"输出块宽度"、"输出块高度"和/或"网格向下采样因子"。

    或者、您可以尝试半自动模式、看看它是否可以在 m=2时找到较小的块大小。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但是、我在   DCC 工具中发现仿射变换环绕、即 S14Q12、B S14Q12、D S14Q12、E S14Q12、如下所示:

    实际上、,A 是 asamplesensor_mesh_LDC_DCC xml 文件和教程中的 S16Q12。 我 使用  了 OpenCV 的 getPerspectiveTransform,并得到了仿射矩阵。

    E 为 -10758、我 无法在 DCC 工具中设置 E。 您能告诉我 DCC 工具和 xml 文件之间的区别吗? 如果我想设置 E -10758、应该怎么办。 我是否 有较旧版本的 DCC 工具?


    在此感谢您的指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的反馈!
    这看起来像是 DCC 工具中的一个限制。
    TDA3中的参数已扩展到 TDA4上的 S16、但该工具的 GUI 尚未更新。
    我们必须在下一个版本中修复该问题。

    您可以手动编辑 xml 文件、以便可以在用于 H/W 的 PSDK 中使用所需参数
    但是、您现在无法在 DCC 工具中使用半自动模式来处理块参数。
    如果您在这方面需要任何帮助、请上传您的配置、LUT 和输入图像、以便我可以为您进行检查。

    通常、我们建议使用单网格 LUT 将本机矩阵和失真校正相结合、因为矩阵是以 H/W 表示的整数实现、精度有限、并且当矩阵系数较大时、它可能会遇到各种数字问题。
    当透视图变化相对较小(例如、3D 变化小于10度)时、可以使用矩阵。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢!

    这是我 的配置

    输出帧宽度:  1280

    输出机架高度: 960

    像素垫:            1.

    输出块宽度:  64

    输出块宽度:  32

    输入帧宽度:  1280

    输入机架高度: 960

    表子采样因子:2.

    网格框架宽度:1280

    网格框架高度:960

    //鱼眼

    imagePoints[0].x = 551;

    imagePoints[0].y = 573;

    imagePoints[1].x = 717;

    imagePoints[1].y = 573;

    imagePoints[2].x = 474;

    imagePoints[2].y = 742;

    imagePoints[3].x = 784;

    imagePoints[3].y = 748;

    //长度= 150

    objectPoints[0].x = 550;

    objectPoints[0].y = 700;

    objectPoints[1].x = 700;

    objectPoints[1].y = 700;

    objectPoints[2].x = 550;

    objectPoints[2].y = 850;

    objectPoints[3].x = 700;

    objectPoints[3].y = 850;

     

    矩阵:

    [-0.4948922442477、-1.623999846410909、926.3625358169062;

     -0.04000450703472036、-2.626383236679303、1174.573710360835;

     -5.714929576387329e-05、-0.002568795522952905、1]

     输入图像:

    在此感谢您的指导。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还可以分享您的 LUT 吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是  MATLAB 生成的 LDC_MESH。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1990 1492
    1966 1484
    1943 1476
    1921 1468
    1898 1460
    1875 1452
    1852 1443
    1830 1435
    1807 1427
    1785 1418
    1763 1410
    1740 1402
    1718 1393
    1696 1385
    1674 1376
    1653 1368
    1631 1359
    1609 1350
    1588 1342
    1566 1333
    1545 1324
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的分享!
    我已经使用您的设置进行了测试。

    遗憾的是、LDC H/W 无法支持该矩阵
    LDC H/W 具有设计限制、例如将所有负"z = G * x + H * y + 1.0"削平为0。

    校准点的所有 z 值都为负值。

    Fullscreen
    1
    2
    3
    -276.8750, -359.0271, -513.2243, -676.3849,
    -352.3864, -359.0271, -793.1648, -821.3245,
    -0.5034, -0.5129, -0.9331, -0.9663,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在这种情况下、您必须使用包含3D 摄像头旋转和失真校正的单网格 LUT。
    如果您使用 OpenCV 生成正确的输出视图、您可能会看到是否可以从 OpenCV 输出坐标并将其转换为网格 LUT 格式。

    此外、在输出图像范围(0、0)~(128、960)内的某些位置、本机的条件不佳。
    如果您对计算有信心、则必须调整输出图像范围、以避免生成 LUT 时出现极性。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vn、

    我不确定你的家庭档案是否有任何问题,但我不能使它正常工作.

    我修改了 MATLAB 代码、以输出如下所示的鸟瞰图 LUT。
    您可以在调优工具中使用输出 LUT 而不使用矩阵来查看输出图像。
    您还可以根据您的家庭记录矩阵检查我添加的旋转/翻译。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function ldc
    gen_lut('ldc_spec.txt', 3/1000, 1.78, 1280, 960, 640, 480, 1, 2);
    end
    % read the distortion specification table(angle and height)
    function lut = read_spec(spec_file, pitch_in_mm)
    lut0 = dlmread(spec_file);
    theta = lut0(:,1)/180*pi;
    lut = [theta, lut0(:,2)/pitch_in_mm];
    end
    % back map
    function [h_d, v_d] = xyz2distorted(x, y, z, hc, vc, spec_file, pitch_in_mm)
    xt = x-hc; yt = y-vc; zt = z*ones(size(xt));
    yt = yt - 470;
    zt = zt - 250;
    [zt, yt] = rotate(zt, yt, 72);
    [phi, r] = cart2pol(xt, yt);
    theta = atan2(r, zt);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX