TDA4——LDC畸变校正模块LUT的创建和生成

首先给大家提供几个TI官方提供的帖子,我也是在综合这些帖子里,反复验证得到最终结果的。


1、[FAQ] TDA4VM: How to create a LDC mesh LUT for fisheye distortion correction on TDA4?

2、TDA4VM: TDA4 LDC tuning issue

3、TDA4VM: Mesh LUT Generation

供大家参考!

Before(1280 x 944 uyuv 图像):

After(1280 x 720 uyuv 图像):

流程总结
1、供应商提供畸变表。

2、使用MATLAB将畸变表转换成Mesh.txt 校准网格表。

3、使用PROCESSOR_SDK_VISION 视觉工具包,转换生成畸变校正lut(look up table)矫正表。

4、将畸变校正lut表,加载到程序内,提供给app_ldc_module 使用

5、使用DCC Tuning tools 微调相关参数,并实时观察畸变矫正的生成效果图。

6、将经过DCC Tuning tools微调参数、调用MATLAB生成Mesh.txt 时的参数,加载到应用程序内。

7、最终完成应用程序配置参数、调用畸变矫正表,完成畸变校正的 LDC功能。
————————————————

 一、从摄像头厂家获取畸变表
        这个表可以向摄像头的供应商去查询、索取。同时还需要向摄像头厂家索取摄像头的相关内参,如焦距、像素大小等。

这里按照E2E上面这个帖子给的Demo 作为示例展示(图像和畸变表来源)。

由于参数较多,这里删除了一部分参数,我会把所有的资料上传到 GitEE库 里面。

1、畸变表
0    0
1    0.01484264
2    0.02969027
……………………………………
94    1.76723187
95    1.78707414
96    1.80636008
        一般厂家会提供一个excel的畸变表格,直接从表格中复制,到文本里面粘提即可获取到这个畸变表。
        对应上表的:
        第一列是角度         Angle ;
        第二列是高度        Height(这个值不确定从相机的那个物理结构上获取到,有兴趣的同学可以研究一下。)

2、摄像机关键内参(厂家提供)
        焦距(f_in_mm):                        0.85 mm
        像素大小(pitch_in_mm):         0.0028 mm

二、使用 MATLAB 得到Mesh网格表

Matlab源码,此处源码可以直接复制到Matlab使用,根据需要修改gen_run.m内参数即可(出自开头部分的几个帖子链接)。

1、Matlab函数文件 gen_lut.m

function [] = gen_lut(spec_file, pitch_in_mm,f_in_mm, W, H, hc, vc,s ,m)
f = f_in_mm/pitch_in_mm ; 
[h_p , v_p] = meshgrid( 0:W, 0:H);
[h_d,v_d] = xyz2distorted(h_p,v_p, f/s, hc, vc,spec_file, pitch_in_mm);
h_delta = round((h_d-h_p) * 8);
v_delta = round((v_d-v_p) * 8);
mh = h_delta(1:2^m:end, 1:2^m:end)';
mv = v_delta(1:2^m:end, 1:2^m:end)';
dlmwrite('mesh.txt', [mh(:), mv(:)],  'delimiter', ' ');
 
function [h_d, v_d] = xyz2distorted(x, y, z, hc, vc, spec_file, pitch_in_mm)
[phi, r] = cart2pol(x-hc, y-vc);
theta = atan2(r, z);
lut = read_spec(spec_file, pitch_in_mm);
r = interp1(lut(:,1), lut(:,2), theta);
[h_d, v_d] = pol2cart(phi, r);
h_d = h_d + hc;
v_d = v_d + vc;
 
 
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];

2、Matlab可执行文件 gen_run.m

    s = 2;
    m = 4;
    pitch_in_mm = 0.0028;
    f_in_mm = 0.85;
    W = 1280;
    H = 944;
    hc = W/2;
    vc = H/2;
    Wmesh = ceil(W / 2^m) * 2^m;
    Hmesh = ceil(H / 2^m) * 2^m;
    gen_lut("spec_file.txt", pitch_in_mm, f_in_mm, Wmesh, Hmesh, hc, vc, s, m);

参数说明:

S 输出视图大小
m 网格下采样大小
pitch_in_mm 像素大小,单位mm
f_in_mm 镜头焦距,单位 mm
W 摄像头传感器输出图像宽度
H         摄像头传感器输出图像高度
hc 暂不明确(可能是中心点坐标y)
vc 暂不明确(可能是中心点坐标x)
Wmesh 输出Mesh网格表宽度
Hmesh 输出Mesh网格表高度

3、运行 gen_run.m 文件获取mesh.txt文件

A、创建单独文件夹,存放刚刚两个matlab可执行文件,gen_lut.m \ gen_run.m

B、创建畸变表文件 spec_file.txt ,将摄像头供应商提供的畸变表,复制进来,只需要角度和高度。

 

C、打开gen_run.m并点击运行

生成mesh.txt 文件,得到的是一个2列,4860行的文件。

这个4860是这样生成的。

4860 entries means the downscaling factor is 16, (1280/16 + 1)x(944/16 + 1) = 4860.

 

 

四、下载并安装PROCESSOR_SDK_VISION视觉工具包

        当时没找到路怎么走的的时候,抓耳挠腮,不知道怎么转换,然后偶然在一个帖子下方,发现了这个下载链接,这才知道需要下载另外的软件对mesh.txt进行转换。

 帖子地址:TDA4VM: Mesh LUT Generation - Processors forum - Processors - TI E2E support forums


————————————————
版权声明:本文为CSDN博主「AIRKernel」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AIRKernel/article/details/125676412

工具下载地址:PROCESSOR_SDK_VISION 03_08_00_00 - TI.com

因为我用的是ubuntu18.04,所以我下载了第二个PROCESSOR_SDK_VISION_03_08_00_00.bin

 这个解压,就不多说了,变更个权限,直接运行bin文件就行。

 

五、使用视觉工具包转换Mesh网格表到 LUT

用VScode打开整个目录:PROCESSOR_SDK_VISION_03_08_00_00

1、将使用Matlab生成的mesh.txt

拷贝到以下路径:

vision_sdk/apps/tools/LDC_mesh_table_convert/

 

 

2、执行转换命令

在 vision_sdk/apps/tools/LDC_mesh_table_convert/ 路径下执行命令:

./convert.sh mesh.txt 1280 944 16

后面跟的三个参数,是在Matlab文件 gen_run.m 中的对应参数

mesh.txt 网格表(由Matlab代码参考畸变表和摄像机内参,执行后生成)
W = 1280 1280
H = 944 944
m =4 2^m = 16(这里是根据m的值变化的,需要和Matlab里参数保持一致)

convert.sh 文件里面标示需要输入的几个参数,如上表。

        第二行里面有一个输出bin文件的指令,我直接让他指向到另外一个文件,这样就能得到想要的 mesh_lut.h 表了,直接供vision_apps 里面的LDC模块使用了。

perl MeshToBin.pl $1 $2 $3 $4
xxd -c2 -i $1.bin > ./mesh_lut.h

得到了一个具有23040个字节的lut表(Look Up Table) ,后面就可以直接移植到LDC node里面了。

六、使用DCC Tuning tools 实时查看转换效果


Windows Only!

注意:这个DCC 工具,需要联系当地的供应商提供,可能还需要签订一份NDA协议。请提前联系。

For DCC Tool, it is released on CDDS, so please check with your local TI support to get access to it.

 

1、选择LDC调整模式

2、设置相应参数

从1280 x 944 输出到 1280 x 720

项目 参数值 说明 备注
Tuning method Manual 调整模式  
Enable On 是否使能调整  
Mode YUV422(UYVY) 8b 调整文件的格式  
convert from 422 to 420 No 根据需要是否输出420格式的图像  
12-bit packed No 不明确,默认选No  
Output frame width 1280 需要输出的帧的宽度  
Output frame height 720 需要输出的帧的高度  
Output frame x coordinate 0 输出帧的x坐标(不明确)  
Output frame y coordinate 112

输出帧的x坐标(不明确)

(944-720) / 2 ?  不知道是否正确

 
Interpolation type for Y data Bilinear 差值方法(双线性或双三次差值)  
Pixel pad 1 不明确  
Output block width 32    
Output block height 32    
Affine transform warp ……

A = 4096

B、C、D = 0

E = 4096 

F、G、H = 0

这里使用的是默认值,暂不明确是什么  
Input frame width 1280 输入图像的宽度  
Input frame height 944 输入图像的高度  
Table subsampling factor  4 网格下采样大小  
Mesh frame width 1280 网格宽度  
Mesh frame height 944 网格高度  
SL2 Size 20340 这个值和通过五、2小点转换出来的大小相当。  

3、加载图片和Mesh网格表

在input image内选择需要转换的图片,并加载到系统内。

 

加载Mesh.txt 网格表

4、DCC工具自动调整

在菜单Execute中找到Process Plugin.

执行,会出现以下效果。

5、输出 LUT文件和 xml文件

如下图:生成的文件路径:./plugoutdir\xml\ 下

TI 官方回复这两个帖子使用方法(帖子地址):
 
5. You may copy the above xml file and its included txt file to the "imaging/sensor_drv/src/sensor_name/dcc_xmls/" folder in PSDK for your sensor.
PSDK sample apps such as "vx_app_single_cam" will pick up the new DCC settings after you re-compile PSDK.

七、LDC模块移植和实验Demo验证

在Gitee库里面,我已经完成了单独使用app_ldc_module 模块的功能。

关键地方提一下:app_ldc_module.h 里面的一些宏定义,一定要和在进行Matlab转换时的、和使用DCC tuning tools 时的参数保持一致!!!否则会无法运行!!!

        注意:

1、输入LDC Node 模块的图像大小,需要设置成摄像头输出图像的大小!

    //图像为原始图像 1280 × 944 的鱼眼摄像头的原始图像,鱼眼摄像头,给定的图像为 UYVY 格式的图像
    in_width = 1280;        //输入图像的宽度
    in_height = 944;        //输入图像的高度
 
    //创建相机输出图像,1280 × 944 UYVY 格式
    obj->camera_output_image = vxCreateImage(obj->context, in_width, in_height, VX_DF_IMAGE_UYVY);

 

2、在app_ldc_module.h 内有几个宏定义,需要和Matlab内、DCC Tuning tools内的实际参数 保持一致!!

3、最终在TDA4上跑起来了,效果如下:

原图

TDA4上的实际效果

文章转载自:https://blog.csdn.net/AIRKernel/article/details/125676412 

 

posted @ 2023-07-13 13:47  半山腰的风景  阅读(557)  评论(0编辑  收藏  举报