[TI TDA4 J721E] Sensor 鱼眼摄像头 LDC畸变校正模块LUT的创建和生成——详解

        首先感谢阅读,如果您也对TDA4相关的开发感兴趣,我们这边有个学习交流微信群,可以入群和大家一起交流学习。

资历较浅,水平有限,如遇错误,请大家多指正!

保持开源精神,共同分享、进步!

博主WX : AIR_12  我会拉你入群。

链接:TDA4 相关专栏        链接:TDA4  Demo  Gitee开源库

欢迎大家加入,一起维护这个开源库,给更多的朋友提供帮助。


        历经近两周的时间,终于把畸变校正LDC模块相关的流程搞懂了,下面将流程梳理一下,也希望能给相关的小伙伴,提供一个参考!

首先给大家提供几个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.

mesh.txt


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

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

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

工具下载地址: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 = 12801280
H = 944944
m =42^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.

 如上所述。

如果获取到了DCC Tuning tool,按以下流程操作。

1、选择LDC调整模式

 2、设置相应参数

 从1280 x 944 输出到 1280 x 720

项目参数值说明备注
Tuning methodManual调整模式
EnableOn是否使能调整
ModeYUV422(UYVY) 8b调整文件的格式
convert from 422 to 420No根据需要是否输出420格式的图像
12-bit packedNo不明确,默认选No
Output frame width1280需要输出的帧的宽度
Output frame height720需要输出的帧的高度
Output frame x coordinate0输出帧的x坐标(不明确)
Output frame y coordinate112

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

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

Interpolation type for Y dataBilinear差值方法(双线性或双三次差值)
Pixel pad1不明确
Output block width32
Output block height32
Affine transform warp ……

A = 4096

B、C、D = 0

E = 4096 

F、G、H = 0

这里使用的是默认值,暂不明确是什么
Input frame width1280输入图像的宽度
Input frame height944输入图像的高度
Table subsampling factor 4网格下采样大小
Mesh frame width1280网格宽度
Mesh frame height944网格高度
SL2 Size20340这个值和通过五、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上的实际效果

  


【声明】
【欢迎转载转发,请注明出处。原创比较辛苦,请尊重原创,祝大家学习愉快!】
【博主专注嵌入式开发,具有多年嵌入式软、硬件开发经验,欢迎大家学习交流!】
【如有嵌入式相关项目需求,欢迎私信】

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值