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\ 下
七、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