1. GDC模块简述:
1.1 硬件特性:
GDC作为一个硬件模块,可将输入的图像进行视角变换、畸变校正和指定角度(0,90,180,270)旋转。
模式支持的输入图像典型尺寸为3840*2160,2688*1944,1920*1080,1280*720,640*480,480*320。
硬件特性如下:
最大分辨率:3840x2160
最小分辨率:100x100(奇数行或者列不支持)
性能:3840x2160,60fps
工作模式:ddr-gdc-ddr
输入格式:YUV420 semi-planar
输出格式:YUV420 semi-planar
1.2 软件功能:
本文的demo sample采用回灌流程,即从系统存储中读取文件,作为GDC的输入图像。 依赖 libgdcbin.so 将GDC坐标点通过计算生成二进制bin文件,调用VIO API实现整个数据通路,完成GDC处理。

1.2.1 GDC控制接口:
hb_vio_gen_gdc_cfg:生成gdc模块的工作所需的cfg bin文件。
hb_vio_set_gdc_cfg:设置gdc模块的cfg bin。
hb_vio_free_gdc_cfg:释放生成gdc模块cfg bin的内存。
hb_vio_run_gdc:使能gdc处理(gdc offline模式使用,运行前需要设置gdc对应cfg bin)。
hb_vio_run_gdc_opt:使能gdc进行处理(gdc offline模式使用,运行前需要设置gdc对应cfg bin,J6E/M只支持gdc id 0),与hb_vio_run_gdc差异点如下:
hb_vio_run_gdc_adv_user:使能gdc进行处理(gdc offline模式使用,并传入cfg bin 参数,J6E/M只支持gdc id 0),用户需要通过 hb_mem 相关接口或hb_vio_get_data对应 HB_VIO_GDC_FEEDBACK_SRC_DATA获取需要处理数据写入地址src_img_info,通过 hb_mem相关接口获取处理结果地址dst_img_info,gdc处理完成的结果会存入dst_img_info中。
hb_vio_free_gdcbuf:释放gdc模块的输出buffer。
1.2.2 API调用流程:
1.2.2.1 回灌流程:
回灌流程,指的是系统存储中读取文件,作为GDC的输入图像,进行处理。典型调用流程图如下:

使用自定义GDC配置,和默认使用的区别,主要是hb_vio_set_gdc_cfg 的内容由接口直接带入,无需hb_vio_set_gdc_cfg接口。hb_vio_run_gdc核心处理函数改成hb_vio_run_gdc_adv。调用流程图如下:

1.2.2.2 模块间处理流程:
模块间处理流程,指的是从其他硬件IP模块输出的数据拿来作为GDC的输入图像,进行处理。典型的是从PYM 输出某一层的YUV数据,拿来作为GDC图像处理的输入。处理流程图如下:

1.2.3 配置文件说明:
1.2.3.1 vpm_config.json:
GDC、PYM等各个模块都以node体现,如需要node与node之间bind,需要在bind配置里面描述。

GDC部分如下:

1.2.3.2 layout.json
GDC配置的layout.json可由gdc tool工具生成。不同的变换模式有不同的参数,以keystone+dewarping模式和custom模式为例,说明配置参数。
keystone+dewarping模式:
custom模式:
2. STITCH模块简述:
2.1 硬件特性:
stitch是一个可配置的图像拼接计算单元,可以完成多幅图像之间的融合拼接,主要应用于自动泊车场景下的360度环视图像拼接。stitch基于ROI进行计算,每个ROI可以完成两幅源图像的alpha-beta blending融合, 并将其写入目标图像指定的ROI中,这种融合拼接方式可以使得拼接过渡更加自然,同时stitch还支持Y、U、V各通道的增益调节,可以实现源图像间的亮度、色度均衡,进一步提升拼接效果。此外stitch支持用户输入自定义像素级alpha-beta权重值,基此可实现多种融合效果,如背景虚化、图像水印等。
工作模式:
Online blnding: 无需输入LUT表,硬件自动进行融合拼接,要求ROI w=h;该模式下硬件依据配置参数中的过渡带宽度、方向等,自动计算出每个像素点的alpha、beta权重值。
Alpha blending: 需要输入alpha LUT表,硬件读取DDR中的alpha权重值进行加权融合; 其中alpha LUT表中存储着该ROI中每个像素点的alpha权重值。对于每个像素点硬件会分别读取y、uv、alpha的值进行加权融合。
Alpha-beta blending: 需要输入alpha、beta LUT表,硬件读取DDR中的alpha、beta权重值进行加权融合。
Src copy: 不需要输入LUT表,硬件直接拷贝src0。
Src alpha copy: 需要alpha LUT表,硬件读取DDR中的alpha权重值并进行融合src0。
其中,LUT表指的是融合拼接权重参数buf。

2.2 拼接方案:
硬件拼接功能可以完成将多张图片拼接融合生成一张图片。硬件上设计灵活,以ROI为基本处理单位,基于alpha blend算法,使用不同的配置字参数划分出不同的ROI划分区域灵活的配置生成多种不同的拼接方案,并且运用LUT表处理拼接的过渡区域优化效果,在自动驾驶以及ADAS的APA场景下,可以将四路摄像头已经被畸变矫正过后的IPM图像数据拼接成一路360环视图,用于停车位的检测,方便用户查看车位线周边情况进行停车。在APA场景,四路环视泊车,GDC从DDR中获取4张回灌图片和参考点(CFG BIN)通过畸变矫正输出4张IPM图,然后通过STITCH硬件拼接模块使用预先定义好的配置字拼接方案参数(CPG PARAM)进行硬件拼接输出鸟瞰图。
2.2.1 拼接流程:

2.2.2 拼接方式:

四张IPM图通过copy模式放到指定输出地址的指定位置
没有重合的区域可以使用直接拷贝模式
ROI重合区域使用Alpha Blend模式进行融合拼接
2.3 软件功能:
本文的demo sample采用回灌流程,即从系统存储中读取文件作为GDC的输入图像,调用VIO API,基于GDC配置bin文件完成GDC处理,再通过videostitch API和对应的拼接LUT表文件实现对GDC输出图像的拼接,得到鸟瞰图。

2.3.1 STITCH控制接口:
计算拼接输出图片所需内存大小信息。
stitch软件模块参数设置。
启动一次拼接并获取拼接后的图像数据
注意:如果多线程使用hb_videostitch_blending_process与hb_videostitch_set_cfg,请自行加锁使用,不改变配置参数则无需加锁互斥。
当使用内部buf(工作模式为STITCH _MODE_INTERNAL_BUF)时,释放输出buf。
2.3.2 API调用流程:

*由于已经获取gcd_cfg.bin,在gdc_init中不需要再调用hb_vio_gen_gdc_cfg来获取bin文件
2.3.3 配置文件说明:
2.3.3.1 GDC CFG BIN文件:
由GDC参考点txt文件和GDC Layout文件生成。
2.3.3.2 CPG PARAM ROI划分文件(配置字拼接方案参数):
配置字拼接方案即ROI划分表主要包含两类参数:
四张IPM图片在输出内存的摆放位置参数
ROI重叠区域的划分参数
目前这两类参数主要通过CAMERA的外参计算得到,生成流程如下:

2.3.3.3 alpha / beta LUT表文件:
LUT表存放的是alpha/beta融合参数系数,类似权重值,每个ROI都要生成对应像素点的融合参数系数,范围0-255,依次存放进LUT表的内存中, 当ROI的拼接模式使用alpha和beta融合时候,会使用该参数进行融合。
比如 坐标点参数举例章节中的LUT生成:
ROI-0/1: 256*512 ROI-2/3: 560*256 ROI-4/5:256*218 ROI-6/7:256*186
LUT:ROI-0 + ROI-1 + ROI-2 + ROI-3 + ROI-4 + ROI-5 + ROI-6 + ROI-7
目前LUT表可以通过convert_tool工具生成,LUT表生成流程如下:

3. *GDC-GUI-TOOL:
GDC GUI TOOL是一种可在PC上进行处理效果仿真的工具。用户可准备jpg模式的图像,load到gdc-tool中进行离线校正,校正完成后可以直接保存config.bin文件用于硬件校正,也可用保存layout.json文件生成config.bin进行硬件校正。
3.1 Tool启动:
Windows:
官网下载nodejs并配置好环境变量后,*参考https://blog.csdn.net/Nicolecocol/article/details/136788200,进入GDC工具文件目录下(tools/dev-j6-tool-1.6/j6_tools_016/windows_ui/gdc_tool/gdc-tool-gui-xxxx-windows),将该文件夹权限设置成完全控制:

在该文件夹下使用管理员打开命令行并执行:

使用浏览器登陆http://localhost:3000/。

Linux:
官网下载nodejs并配置好环境变量后,*参考https://blog.csdn.net/junxuezheng/article/details/100770084


3.2 Tool基本操作说明:
启动工具后选择需要进行图像处理的图片:*png或jpg

regions下为进行图像处理的一个框(*多个框可进行stitch),包含属性:

Window:用于设置输出框的位置和大小;
Input ROI:进行图像处理的区域(网格大小),ROI区域将填充在Window中;
Parameters:变换模式,不同mapping具备不同参数,具体参考变换模式;

Process: preview可以查看变换网格区域,apply为执行图像变换;
Layout: Save 保存layout.json文件 Load 载入layout.json文件;
所有转换类型都有以下三个常用参数:pan,tilt,zoom。
Pan:

Tilt:

Zoom:

3.3 变换模式:
GUI中的变换模式有Affine,Equisolid,Equisolid(cylinder),Equidistant,Custom,Keystone+dewarping六种变换供选择,如下:

3.3.1 Affine:
提供线性的变换。
设置Transformation为:Affine,设置Window、Input ROI大小:
*输入输出尺寸的宽应该保持16字节对齐。

Rotation为ROI旋转角度;
如例:

3.3.2 Equisolid:
此转换提供等实体(全景panoramic)校正,并将结果显示为平面上的投影。
设置Transformation为:Equisolid,设置Window、Input ROI大小:
*输入输出尺寸的宽应该保持16字节对齐。

如例:

3.3.3 Equisold(cylinder):
此变换为将结果图像投影到柱面全景图的完整鱼眼帧提供等实体校正。
设置Transformation为:Equisold(cylinder),设置Window、Input ROI大小:
*输入输出尺寸的宽应该保持16字节对齐。

3.3.4 Equidistant:
等距变换包含许多参数,这些参数允许它为投影提供一系列不同的目标平面。这使用户可以更自由地选择要变换的鱼眼帧的所需区域。
设置Transformation为:Equidistant,设置Window、Input ROI大小:
*输入输出尺寸的宽应该保持16字节对齐。


举例如下:

3.3.5 Custom:
采用custom变换后,输入图像中的每个多边形都会变换为正方形。换句话说,任何形状的任何四个邻近输入点在转换后都是正方形,如下图所示。但是,多边形的形状和位置在变换后会发生变化。

设置Transformation为:Custom,设置Window、Input ROI大小。
*输入输出尺寸的宽应该保持16字节对齐。
必须先向GDC工具提供一个特殊的校准文件:*可由ConvertTool生成

*配置文件解释:
1.第一行是在像素计算中使能full tile, 1是enable, 0是disable。
2.第二行是如果使能了full file,则要跳过的像素数量;这些值需要大于0,数字越小,libgdc 的性能越慢(性能越慢是指config.bin的大小更大,libgdc生成config.bin的时间更长)。
3.第三行是垂直方向和水平方向标定点的个数,324指的是垂直方向有324个标定点,96指的是水平方向有96个标定点。
4.第四行161和47是选中区域的中心点,通常是垂直方向标定点(Y/2-1)和水平方向标定点(X/2-1)。
e.g. 下图是截取的其中的一部分数据图片,第五行到第九行就是标定点在源图的坐标值,格式是Y:X。以下图为例,一共有324x96个标志点。

5.由于标定点必须是等距离的,这意味着输出图片的分辨率取决于标志点的点数。

e.g. 输出图片的Width = 100, Height的计算如下:1280/Height = (96-1)/(324-1), height = 340
下图是更简单的3x3坐标点转换的示例图:

GDC custom mode对input point的坐标的要求:
1.必须是正的int或者float type。
2.尽量保持同一行里面的采样点是平滑过渡的,如果某两点之间过渡急剧变化,样条线的精度将不足以处理它。
3.不能相邻两行采样点重复。
4.不能4个采样点组成三角形,尽量避免相邻点坐标重。
5.如果采样精度不足(可能导致锯齿,扭曲等情况):a.使用浮点坐标;b.增加采样点。
6.output最小支持的size是100x100。
4. ConvertTool:
用于生成STITCH模块需要使用的CPG PARAM ROI划分文件(配置字拼接方案参数)和alpha/beta LUT表文件(LUT表)。
4.1 工具生成流程示意图:

4.2 工具说明:
进入GDC工具文件目录下:
tools/dev-j6-tool-1.6/j6_tools_016/ubuntu_ui/convert_tool/linux_convert_tool/convert_tool
*window版本与Linux版本下使用方法一致
工具使用命令行传参的方式来执行。目前实现了针对7个不同的场景来生成相应的GDC、STITCH配置文件。
APA场景
旋转场景(Rotate)
去畸变场景(Undistort)
俯视矫正变换场景(Transform)
裁剪场景(Crop)
模糊场景(Blur)
圆柱变换场景(Cylinder)
4.3 使用场景:
4.3.1 APA场景:
输入的配置文件:
camera_x.json --- 相机标定参数文件
global.json --- apa场景配置文件
执行方法:
输出的配置文件:

实现效果:

4.3.2 Rotate场景:
输入的配置文件:
global.json --- rotate场景配置文件
执行方法:
输出的配置文件:
实现效果:

4.3.3 Undistort场景:
输入的配置文件:
摄像头参数文件(camera_0.json)*详情请查看APA场景
undistort场景配置文件(global.json)。
执行方法:
输出的配置文件:
实现效果:

4.3.4 Transform场景:
输入的配置文件:
摄像头参数文件(camera_0.json)*详情请查看APA场景
transform场景配置文件(global.json):
执行方法:
输出的配置文件:
实现效果:

4.3.5 Crop场景:
输入的配置文件:
摄像头参数文件(camera_0.json)*详情请查看APA场景
crop场景配置文件(global.json):
执行方法:
输出的配置文件:
实现效果:

4.3.6 Blur场景:
输入的配置文件:
摄像头参数文件(camera_0.json)*详情请查看APA场景
transform场景配置文件(global.json):
执行方法:
输出的配置文件:
实现效果:

4.3.7 Cylinder场景:
输入的配置文件:
摄像头参数文件(camera_0.json)*详情请查看APA场景
transform场景配置文件(global.json):
执行方法:
输出的配置文件:
实现效果:

5. GDC-Sample使用:
5.1 调用流程:

5.2 Sample源码主干:




get_opts_for_gdc:配置GDC参数

int32_t hb_vio_init(const char *cfg_file):*本Sample中为单进程模式
读取:"/sys/module/hobot_vio_common/parameters/vio_mp_en" 判断是否多进程模式。
单进程:根据VPM配置文件(-v)初始化每个VIO管道。对于初始化错误的管道回滚进行反初始化。
多进程:根据VPM配置文件(-v)初始化每个VIO管道。创建套接字并根据"/var/vio_service.unix"连接服务器并向server发送初始化的VIO管道。
int32_t hb_vio_start_pipeline(uint32_t pipeline_id):
单进程:根据id启动 VIO管道中的实体并激活每个 VFlow 流程中的所有节点(vnode)。
多进程:发送启动命令给server以启动VIO管道,接受server返回的信息。
gdc_cfg_bin_update:
gdc_cfg_bin_gen:
解析layout.json(gdc配置)并通过hb_vio_gen_gdc_cfg生成gdc模块的工作所需的cfg bin文件。
hb_vio_gen_gdc_cfg:->hbn_gen_gdc_cfg:
gdc_init();设置硬件寄存器分配内存并配置组件;
gdc_calculate:根据实例计算gdc并生成bin序列。
hb_vio_set_gdc_cfg:
将获取的bin序列使用hb_mem_flush_buf_with_vaddr刷入给gdc,hbn_vnode_set_attr_ex设置其他节点。
hb_vio_free_gdc_cfg:
释放生成gdc模块cfg bin的内存。
hb_vio_get_data:
HB_VIO_GDC_FEEDBACK_SRC_DATA:指定pipeline_id,获取gdc回灌地址,用来写入需要回灌的数据,给gdc进行畸变矫正。
read_yuv420_file:
读取yuv文件;
hb_vio_run_gdc:
根据已设置的管道id配置,传入需要gdc的图片输出到dst_buf中,设置的-d 只用于检查输出图像是否正确。
使能gdc处理(gdc offline模式使用,运行前需要设置gdc对应cfg bin)。
hb_vio_deinit:
对初始化的所有pipeline进行反初始化并释放初始化申请的资源。
hb_vio_stop_pipeline:
停止对应pipeline
5.3 编译&运行:
获取AppSDK包后,进入appuser执行:
*其中hbrootfs-sdk_0.0.1.XXX_all.deb是地平线自己的库和头文件,rootfs-sdk-focal_0.0.1.XXX_all.deb是系统库,aarch64-linux-hb-gcc_12.2.0_amd64.deb是gcc 12.2.0工具链,目前在ubuntu22.04非docker环境下运行正常。其它环境不能保证。
进入toolchain执行:
Sample代码路径:
复制/src源码到新建文件夹gdc并构建新Makefile:
*cfg和res也拷贝到该目录,配置文件的具体生成请参考ConvertTool和GDC-GUI-TOOL。
请修改camera_x_layout.json下param为执行目录下camera_x_gdc_config_x.x.txt的路径。
*不修改则直接使用芯片内部Sample的camera_x_gdc_config_x.x.txt。

Makefile:
执行make完成编译,生成的文件为./program

使用WinScp将对应的vpm配置、yuv文件、gdc配置文件和program传输到单板上。
通过ssh或串口进入/home/hobot/执行:
Sample运行时日志:*以前视为例
生成的yuv文件存放在程序执行目录下。
检查生成的yuv文件,本文档使用YUView:*请用户自行下载
将生成的文件传输给window

使用YUView打开:

*请配置色度分量水平偏移量为1/2:


6. GDC_STITCH-Sample使用(APA场景):
6.1 调用流程:

*由于gcd_cfg.bin通过ConvertTool获取,在gdc_init中不需要再调用hb_vio_gen_gdc_cfg
6.2 Sample源码主干:
GDC初始化和反初始化:
STITCH初始化和反初始化:
参数说明:

6.3 配置文件准备:
生成文件如下:
6.4 编译&运行:
获取AppSDK包后,进入appuser执行:
*其中hbrootfs-sdk_0.0.1.XXX_all.deb是地平线自己的库和头文件,rootfs-sdk-focal_0.0.1.XXX_all.deb是系统库,aarch64-linux-hb-gcc_12.2.0_amd64.deb是gcc 12.2.0工具链,目前在ubuntu22.04非docker环境下运行正常。其它环境不能保证。
进入toolchain执行:
Sample代码路径:
复制/src源码到新建文件夹gdc_stitch并构建新Makefile:
*res下为生成的APA场景配置文件和需要进行gdc_stitch的yuv文件
请修改stitch_config.json下"alpha_file"为 "/home/hobot/res/alpha_lut_apa.bin"。
修改gdc_stitch_sample.c下g_res_path为"/home/hobot/res"


Makefile:
执行make完成编译,生成的文件为./program

通过ssh或串口进入单板/home/hobot/执行:
Sample运行时日志:
生成的yuv文件存放在程序执行目录下。
检查生成的yuv文件,本文档使用YUView:*请用户自行下载
将生成的文件传输给window

使用YUView打开:

*请配置色度分量Y偏移量为0:



