经过近两周的时间,畸变终于得到了纠正LDC了解了模块相关的流程,下面就整理一下流程,也希望能给相关的朋友提供参考!
先给大家提供几个TI在这些帖子中,我也反复验证了官方提供的帖子的最终结果。
1、[FAQ] TDA4VM: How to create a LDC mesh LUT for fisheye distortion correction on TDA4?
2、TDA4VM: TDA4 LDC tuning issue
供大家参考!
流程总结
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功能。
1.从相机制造商获得畸变表
此表可以向相机供应商查询和索取。同时,还需要向相机制造商索取相关内参,如焦距、像素大小等。
这里按照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.相机关键内参(厂家提供)
二、使用 MATLAB 得到Mesh网格表
Matlab源码,这里的源码
1、Matlab函数文件 gen_lut.m
function [] = gen_lut(spec_file, pitch_in_m,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可执行文件,
B、创建畸变表文件
C、打开gen_run.m并点击运行
生成mesh.txt 文件,得到的是一个2列,4860行的文件。
这个4860是这样生成的。
四、下载并安装PROCESSOR_SDK_VISION视觉工具包
当时没找到路怎么走的的时候,抓耳挠腮,不知道怎么转换,然后偶然在一个帖子下方,发现了这个下载链接,这才知道需要下载另外的软件对mesh.txt进行转换。
工具下载地址: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、执行转换命令
在
./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 实时查看转换效果
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、设置相应参数
项目 | 参数值 | 说明 | 备注 |
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文件
如下图:生成的文件路径:
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 模块的功能。
//图像为原始图像 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);
原图
TDA4上的实际效果