Camsys子系统
系统概述
S100 camsys子系统包含Camera sensor (包括 SerDes)、VIN(包括 MIPI、CIM)、ISP、PYM、GDC、YNR、STITCH模块。
简称 | 全称 | 说明 |
---|---|---|
MIPI | Mobile Industry Processor Interface | 移动产业处理器接口,MIPI联盟制定的标准 |
CSI | Camera Serial Interface | Camera串行接口 |
IPI | Image Pixel Interface | MIPI与CIM之间的图像传输接口 |
FOV | Field of View | 视场角 |
SER | Serializer | 加串器 |
SerDes | Serializer and Deserializer | 加串与解串器 |
DES | Deserializer | 解串器 |
CIM | Camera Interface Manger | Camera接入管理模块,支持online或offline工作 |
VIN | Video In(CIM+MIPI+LPWM+VCON) | 视频输入模块 |
ISP | Image Signal Processor | 图像信号处理器 |
PYM | Pyramid | 金字塔处理模块: 图像缩小及ROI |
GDC | Geometric Distortion Correction | 几何畸变校正模块 |
VPF | Video Process Framework(VIN+ISP+PYM..) | 视频处理管理模块 |
VIO | Video In/Out (VIN+VPM) | 视频输入/输出模块 |
STITCH | Stitch hardware Module | 图像拼接处理模块 |
CAMSYS | Camera System (Camera+VPF) | 相机图像系统 |
camsys硬件框图
子模块
CIM
CIM(Camera Interface Manager)是一种专门用来接收MIPI-RX IPI图像数据的硬件。CIM负责同时接入多路图像数据,并改变MIPI IPI接口的时序以匹配后级硬件或DDR的输入时序要求,将图像通过硬件直连或DDR形式提供给ISP和PYM。
- S100上共有3个CIM模块,分别为CIM0 CIM1 CIM4;
- 单个CIM最大支持接入4V * 8M * 30fps,支持接入RAW8、RAW10、RAW12、RAW14、RAW16、RAW20、YUV422-8Bit图像;
- CIM0 CIM1可以硬件直连otf输出至ISP、PYM,同时支持离线输出至ddr,CIM4只支持离线输出;
- CIM0的IPI0最大接入宽为5696,CIM0其他的IPI和其他CIM中的IPI最大接入宽为4096;
ISP
ISP (Image Signal Processor)图像信号处理器,是一种专门用于图像信号处理的引擎。 ISP的功能包括对原始图像进行各类算法处理、图像特性统计、色彩空间转换、多路通道分时复用控制等,最终输出更清晰、更准确、高质量的图像。
- S100上共有2个ISP模块,分别为ISP0 ISP1;
- 每个ISP硬件模块IP最大支持12路sensor的接入能力;
- ISP处理最大分辨率为4096 * 2160
- ISP处理pipeline如下图:
- MCFE: Multi-Context Front End,用于ISP多路调度控制与buffer管理,one by one进行Multi-camera图像处理。
- RAW Domain: RAW域图像处理,包含input port (含input crop功能)、channel switch、input formatter、sensor offset linear、digtal gain、gamma FE(即decompander)、gamma_sqrt、raw frontend、static defected、sinter、chromatic aberration、gamma_sq、gamma BE、static white blance、radial shading correction、mesh shading correction、digital gain iridix、iridix、demosaic等。
- RGB Domain: RGB域图像处理,包含purple fringe correction、color matrix、gamma RGB forward SQ、crop、CNR、gamma RGB reverse SQ、RGB gamma等。
- Output formatter: CS(color space) coversion,将RGB通道数据转换成YUV 等format,output control 进行输出控制。
YNR
YNR为yuv域的降噪模块Digital Noise Reduction,YNR支持2DNR与3DNR模式
- S100上共有一个YNR模块,YNR1,只支持ISP1-online-YNR1-online-PYM1场景;
- 在3DNR模式下,处理的最大宽高为2048x2048,在2DNR模式下支持3840x2160;
PYM
PYM(Pyramid)作为一个硬件加速模块,对输入的图像按照金字塔图层的方式处理,并输出到DDR。
- S100上共有3个PYM模块,分别为PYM0 PYM1 PYM4;
- SRC层:代表源图像层;
- BL层:代表双线性下采样层,BL Base 0~4依次是源图层的1/2,1/4,1/8,1/16,1/32;
- DS层:输出层,每层能够任意选择输入图层(SRC或0~4BL),并进行下采样和ROI处理后输出到DDR;
- 最大输入宽度输入高度均为4096,最小输入宽度及高度为32;
- 缩小ratio(1/2,1],不支持放大;
- PYM0/1:4k@120fps,PYM4:4K@90fps,PYM4不支持online输入;
GDC
GDC作为一个硬件模块,可将输入的图像进行视角变换、畸变校正和指定角度(0,90,180,270)旋转。
模式支持的输入图像典型尺寸为3840x2160,2688x1944,1920x1080,1280x720,640x480,480x320。
硬件特性如下:
- 最大分辨率:3840x2160
- 最小分辨率:96x96(奇数行或者列不支持)
- 性能:3840x2160,60fps
- 工作模式:ddr-gdc-ddr
- 输入格式:YUV420 semi-planar
- 输出格式:YUV420 semi-planar
GDCTool简介
GDC Tool是一种可在PC上进行处理效果仿真的工具。用户可准备jpg模式的图像,load 到gdc-tool中进行离线校正,校正完成后可以直接保存config.bin文件用于硬件校正,也可用保存layout.json文件生成config.bin进行硬件校正
GDC Tool 启动
-
window环境启动
安装环境:依赖nodejs安装,参考:https://nodejs.cn/download/
安装执行依赖:在win命令行,进入GDC 发布的工具文件(如gdc-tool-gui-xxxx-windows)目录下,执行npm install express
启动应用:在win 命令行进入文件目录(如gdc-tool-gui-xxxx-windows),执行node.exe app.js,Chrome浏览器登陆http://localhost:3000/
-
unix 环境启动
安装环境:mac: brew install node
安装执行依赖:文件目录下执行npm install -production
启动应用:执行node app.js,登陆http://localhost:3000/
GDC Tool 中的变换模式
变换模式有Affine,Equisolid,Equisolid(cylinder),Equidistant, Custom, Keystone+dewarping六种变换供选择,这些模式与软件中的变换模式对应关系见GDC Bin API文档中的 transformation_t 描述,下表是各个变换的用途
变换模式 | 用途 |
---|---|
Affine | 一种线性变换,简单的图像旋转功能,没有畸变校正 |
Equisolid | 全景变换,变换网格最大 |
Equisolid(cylinder) | 圆柱形变换 |
Equidistant | 等距变换,变换后的距离等距。 |
Custom | 用户定制变换 |
Keystone+dewarping | 相对于Equidistant,dewarp_keystone 多了两个参数trapezoid_left_angle 和 trapezoid_right_angle。默认情况下这两个参数90度,效果和Equidistant一样。 |
所有转换类型都有以下三个常用参数Pan、Tile、Zoom(举例:等距变换,输入/输出分辨率1280x720): 以下输出图像中的蓝色矩形表示仅将特殊参数设置为该值, 并且一个转换中的其他参数保持默认值。
-
Pan
水平方向 (-1280, +1280)通过给定的像素数,偏移变换网格。如下所示:
-
Tile
垂直方向 (-720, +720)通过给定的像素数,偏移变换网格。如下所示:
-
Zoom
按提供的因子 (0, +∞)缩放变换输出,(0, 1)表示值大于 0 且小于 1。如下所示:
-
Affine
-
功能描述
提供线性的变换
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出, 当旋转角度为180或270时,该值需>=1.03 double angle(rotation) 图像旋转的角度 0/90/180/270 注意!输入输出尺寸的宽应保持16字节对齐。
zoom 参数在旋转角度为180或270时,需>=1.03
-
-
Equisolid
-
功能描述
此转换提供等实体(全景panoramic)校正,并将结果显示为平面上的投影。
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 double strengthX 沿X轴的变换强度(非负参数) double strengthY 沿Y轴的变换强度(非负参数) double angle(rotation) 图像旋转的角度 0/90/180/270 strength x调试效果,在X轴的转换强度,取值(0, +∞)。如下所示:
strength y调试效果,在Y轴的转换强度,取值(0, +∞)。如下所示:
Rotation调试效果,取值(-180, 180)。如下所示:
注意!输入输出尺寸的宽应保持16字节对齐。
-
-
Equisold(cylinder)
-
功能描述
此转换提供等实体(全景panoramic)校正,并将结果显示为平面上的投影。
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 strength 转换的强度 double angle(rotation) 图像旋转的角度 0/90/180/270 strength 调试效果,转换的强度(0,+∞)。如下所示:
rotation 调试效果,取值范围(-180,+180)。如下所示
注意!输入输出尺寸的宽应保持16字节对齐。
-
-
Equidistant
-
功能描述
等距变换包含许多参数,这些参数允许它为投影提供一系列不同的目标平面。这使用户可以更自由地选择要变换的鱼眼帧的所需区域。
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 double angle(rotation) 图像旋转的角度 0/90/180/270 double elevation 定义了投影轴的仰角,范围0到90 double azimuth 定义了投影轴的方位角度。如果仰角参数elevation为0,则方位角将没有可见效果 int32_t keep_ratio 转当 “保持比率”参数打开时,FOV高度参数将被忽略,其值将自动计算,以在水平和垂直方向上保持相同的拉伸强度 double FOV_h 描述水平维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double FOV_w 描述垂直维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double cylindricity_y 描述目标投影沿Y轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,而“圆柱度X”值设置为0,则投影将沿Y轴形成圆柱体 double cylindricity_x 描述目标投影沿X轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度Y”值设置为0,则投影将沿X轴形成圆柱体 elevation 调试效果:
azimuth 调试效果:
rotation 调试效果:
cylindricity x调试效果:
描述目标投影沿X轴的球形程度。该值的范围为0到1,其中1为球形。如果该值设置为1,圆柱度Y值设置为0,则投影将沿X轴形成圆柱。如下所示:
cylindricity y调试效果:
描述目标投影沿Y轴的球形程度。该值的范围为0到1,其中1为球形。如果该值设置为1,圆柱度X值设置为0,则投影将沿Y轴形成一个圆柱体。如下所示:
注意!输入输出尺寸的宽应保持16字节对齐。 正常的视力值大约是90度。对于圆柱度(见下文)等于“0”的变换,视场宽度和高度180的值将导致图像无限拉伸。 如果cylindricity_x和cylindricity_y圆柱度值都设置为1,则投影将是球形的。如果两者都是0,则变换将是矩形的。
-
-
Custom
-
功能描述
采用custom变换后,输入图像中的每个多边形都会变换为正方形。换句话说,任何形状的任何四个邻近输入点在转换后都是正方形,如下图所示。但是,多边形的形状和位置在变换后会发生变化。
它们用于创建任何提供的转换都无法描述的转换。为了纠正任意失真,必须向GDC工具提供一个特殊的校准文件config0.txt。如下图
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 char custom_file[128] config.txt文件名称 custom_tranformation_t custom 解析的自定义转换结构 Config file的规则大致需要注意一下几点:
-
第一行是在像素计算中使能full tile, 1是enable, 0是disable。
-
第二行是如果使能了full file,则要跳过的像素数量;这些值需要大于 0,数字越小,libgdc 的性能越慢(性能越慢是指config.bin的大小更大, libgdc生成config.bin的时间更长)。
-
第三行是垂直方向和水平方向标定点的个数, 第一个值Y = 1081指的是垂直方向有1081个标定点,第二个值X = 1921指的水平是方向有1921个标定点。
-
第四行是选中区域的中心点,通常是(Y-1)/2、(X-1)/2。
-
标定点必须是大于等于0的int或float类型、相邻两行的标定点不能重复。 eg.下图是截取的其中的一部分数据图片,第五行到第九行就是标定点在源图的坐标值,格式是Y: X。以下图为例,一共有1081x1921个标定点。
-
由于标定点必须是等距离的,这意味着输出图片的分辨率取决于标定点的点数。
eg. 输出图片的Width = 100, Height计算为340,计算过程如下:100/height = (96-1)/(324-1)
下图是更简单的3x3坐标点转换的示例图
-
-
-
Keystone+dewarping
-
功能描述
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 double angle(rotation) 图像旋转的角度 0/90/180/270 double elevation 定义了投影轴的仰角,范围0到90 double azimuth 定义了投影轴的方位角度。如果仰角参数elevation为0,则方位角将没有可见效果 int32_t keep_ratio 当“保持比率”参数打开时,FOV高度参数将被忽略,其值将自动计算,以在水平和垂直方向上保持相同的拉伸强度 double FOV_h 描述水平维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double FOV_w 描述垂直维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double cylindricity_y 描述目标投影沿Y轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,而“圆柱度X”值设置为0,则投影将沿Y轴形成圆柱体 double cylindricity_x 描述目标投影沿X轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度Y”值设置为0,则投影将沿X轴形成圆柱体 double trapezoid_left_angle 默认90;0.1到90 ;变换网格中,左边边界相对于底边边界的角度,见实际效果 double trapezoid_right_angle 默认90;0.1到90 ;变换网格中,右边边边界相对于底边边界的角度,见实际效果 注意!输入输出尺寸的宽应保持16字节对齐。
-
GDC Tool变换模式参数说明
配置文件可由GDC tool 生成,以layout.json存在。不同的变换模式有不同的参数,以custom模式和keystone+dewarping模式为例,说明配置参数。
-
keystone+dewarping模式
{
"inputRes": [
1920, // 输入图像尺寸的宽
1080 // 输入图像尺寸的高
],
"param": {
"fov": 180, // 输入图像的视场角
"diameter": 1080, // 输入图像的直径,可控制变换网格的整体大小
"offsetX": 0, // 变换网格在水平方向的偏移
"offsetY": 0 // 变换网格在垂直方向的偏移
},
"outputRes": [
1920, // 输出图像尺寸的宽
1080 // 输出图像尺寸的高
],
"transformations": [
{
"transformation": "Dewarp_keystone", // 变换模式
"position": [ // 输出图像的ROI区域设定
0, // 输出图像的ROI水平方向的偏移
0, // 输出图像的ROI垂直方向的偏移
1920, // 输出图像的ROI的宽
1080 // 输出图像的ROI的高
],
"param": {
"left_base_angle": 90, // 默认90;0.1到90;变换网格中,左边边界相对于底边边界的角度
"right_base_angle": 90, // 默认90;0.1到90;变换网格中,右边边界相对于底边边界的角度
"azimuth": 90, // 定义了投影轴的方位角度。如果仰角参数elevation为0,则方位角将没有可见效果
"elevation": 0, // 定义了投影轴的仰角,范围0到90
"rotation": 0, // 输出图像要旋转的角度
"fovWidth": 90, // 描述水平维度中输出视图字段的大小(以度为单位)。 数值越大,变换网格水平方向越宽,有效值的范围是从0到180
"fovHeight": 90, // 描述垂直维度中输出视图字段的大小(以度为单位)。数值越大,变换网格垂直方向越宽,有效值的范围是从0到180
"keepRatio": 0, // 当“保持比率”参数为1时候,fovHeight参数将被忽略,其值将自动计算,以在水平和垂直方向上保持相同的拉伸强度
"cylindricityX": 1, // 描述目标投影沿X轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度Y”值设置为0,则投影将沿X轴形成圆柱体。
"cylindricityY": 1 // 描述目标投影沿X轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度Y”值设置为0,则投影将沿X轴形成圆柱体。
},
"ptz": [
0, // pan参数
0, // tile参数
1 // zoom参数
],
"roi": { // 输入图像ROI区域设定
"x": 0, // 输入图像ROI区域的水平方向偏移
"y": 0, // 输入图像ROI区域的垂直方向偏移
"w": 1920, // 输入图像ROI区域的宽
"h": 1080 // 输入图像ROI区域的高
}
}
],
"mode": "planar420", // 处理的格式设定
"eccMode": "eccDisabled", // 处理的ecc模式
"colourspace": "yuv" // 处理的数据格式
} -
custom模式
{
"inputRes": [
1280, // 输入图像尺寸的宽
720 // 输入图像尺寸的高
],
"param": {
"fov": 192, // 输入图像的视场角
"diameter": 720, // 输入图像的直径,可控制变换网格的整体大小
"offsetX": 0, // 变换网格在水平方向的偏移
"offsetY": 0 // 变换网格在垂直方向的偏移
},
"outputRes": [
560, // 输出图像尺寸的宽
258 // 输出图像尺寸的高
],
"transformations": [
{
"transformation": "Custom", // 变换模式
"position": [ // 输出图像的ROI区域设定
0, // 输出图像的ROI水平方向的偏移
0, // 输出图像的ROI垂直方向的偏移
560, // 输出图像的ROI的宽,小于等于outputRes的宽
258 // 输出图像的ROI的高,小于等于outputRes的高
],
"ptz": [
0, // pan参数
0, // tile参数
1 // zoom参数
],
"roi": { // custom模式下无效
"x": 0, // custom模式下无效
"y": 0, // custom模式下无效
"w": 0, // custom模式下无效
"h": 0 // custom模式下无效
},
"param": {
"customTransformation": "/path_to/camera_0_gdc.txt" // 坐标点文件的在板子中的路径
}
}
],
"mode": "planar420", // 处理的格式设定
"eccMode": "eccDisabled", // 处理的ecc模式
"colourspace": "yuv" // 处理的数据格式
}注意!- ecc mode统一填写ecc is disable。可选ecc mode使能,但没有实际效果。
- 当参数为小数时,保证精度为浮点运算以后8位小数及以上,否则可能生成的bin不一致。
- 用户填充数据结构或者json时填充的信息应该包含各种模式示例所有项。
- 非custom模式,配置文件中的roi参数代表输入图片的roi。
- 配置文件中的position参数代表输出图片的roi。
-
Affine 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Affine",
"position": [
0,
0,
1920,
1080
],
"param": {
"rotation": 0
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "planar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Equisolid 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Panoramic",
"position": [
0,
0,
1920,
1080
],
"param": {
"strength": 1,
"strengthY": 1,
"rotation": 0
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "planar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Equisolid(cylinder) 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Stereographic",
"position": [
0,
0,
1920,
1080
],
"param": {
"strength": 1,
"rotation": 0
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "planar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Equidistant 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Universal",
"position": [
0,
0,
1920,
1080
],
"param": {
"azimuth": 0,
"elevation": 0,
"rotation": 0,
"fovWidth": 90,
"fovHeight": 90,
"keepRatio": 0,
"cylindricityX": 1,
"cylindricityY": 1
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "planar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Custom 输入1280x720,输出560x258。配置文件内容如下:
{
"inputRes": [
1280,
720
],
"param": {
"fov": 192,
"diameter": 720,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
560,
258
],
"transformations": [
{
"transformation": "Custom",
"position": [
0,
0,
560,
258
],
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 0,
"h": 0
},
"param": {
"customTransformation": "/path_to/camera_0_gdc_config_3.1.txt"
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Keystone+dewarping 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 180,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Dewarp_keystone",
"position": [
0,
0,
1920,
1080
],
"param": {
"left_base_angle": 90,
"right_base_angle": 90,
"azimuth": 0,
"elevation": 0,
"rotation": 0,
"fovWidth": 90,
"fovHeight": 90,
"keepRatio": 0,
"cylindricityX": 1,
"cylindricityY": 1
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "planar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
GDC bin 相关API参考
以下API用于GDC BIN生成,GDC模块控制API见HBN API。
-
hb_vio_gen_gdc_cfg
【函数声明】
int32_t hb_vio_gen_gdc_cfg(param_t *gdc_parm, window_t *wnds, uint32_t wnd_num, void **cfg_buf, uint64_t *cfg_size)
【参数描述】
- [IN] param_t *gdc_parm:gdc对应参数,包括分辨率,格式等。
- [IN] window_t *wnds:gdc内部区域参数。
- [IN] uint32_t wnd_num: window 数目。
- [OUT] uint32_t **cfg_buf:生成的gdc cfg bin,内部分配。
- [OUT] uint64_t *cfg_size:gdc cfg bin文件的大小。
【返回值】
- 成功:E_OK: Success
- 失败:E_NOT_OK: Fail,return error code;失败,返回错误码;range:[-10000,-1]
【功能描述】
生成gdc模块工作所需的bin文件。
-
hb_vio_set_gdc_cfg
【函数声明】
int32_t hb_vio_set_gdc_cfg(uint32_t pipeline_id, uint32_t *cfg_buf, uint64_t cfg_size)
【参数描述】
- [IN] uint32_t pipeline_id:pipeline id ; 软件通道id;range:[0, 23],default:0;
- [IN] cfg_buf:config buffer of gdc cfg bin; gdc cfg bin 的buffer
- [IN] cfg_size:size of gdc cfg bin ; gdc cfg bin文件的大小
【返回值】
- 成功:E_OK: Success;成功
- 失败:E_NOT_OK: Fail,return error code;失败,返回错误码;range:[-10000,-1]
【功能描述】
设置gdc模块的cfg bin。
-
hbn_free_gdc_bin
【函数声明】
void hb_vio_free_gdc_cfg(uint32_t *cfg_buf)
【参数描述】
- [IN] uint32_t* cfg_buf:Buffer of gdc cfg bin; gdc cfg bin的buffer.
【返回值】
- NONE
【功能描述】
释放生产gdc模块cfg bin的buffer
GDC bin 相关参数说明
-
typedef struct param_t
名称 类型 最小值 最大值 默认值 含义 必选 format frame_format_t 处理图像格式 是 in reso lution_t 实际输入图像尺寸 是 out reso lution_t 实际输出图像尺寸 是 x_offset int32_t 0 0 输入区域沿 x轴的偏移像素数 是 y_offset int32_t 0 0 输入区域沿 y轴的偏移像素数 是 diameter int32_t 定义矩形输入图 像上包含实际鱼眼 照片的输入圆形区 域的像素直径。对 于某些相机,此圆 形图像区域的直径 可以大于或小于矩 形画布的尺寸(有 时可能会被裁剪)一般情况下 diameter 应保持与 input.height 一致。 是 fov double 0 视场定 义输入图像的可视 角度,影响源网格 的曲率。视场越大 ,透视变形越大。 是 -
typedef enum frame_format frame_format_t
名称 类型 最小值 最大值 默认值 含义 必选 FM T_UNKNOWN enum 未知格式 FMT_LUMINANCE enum 暂不支持 FMT_P LANAR_444 enum 暂不支持 FMT_P LANAR_420 enum 暂不支持 FMT_SEMIP LANAR_420 enum NV12 FM T_GDC_MAX enum -
typedef struct resolution_s resolution_t
名称 类型 最小值 最大值 默认值 含义 必选 w uint32_t 宽度(像素) h uint32_t 高度(像素) -
typedef struct window_t
名称 类型 最小值 最大值 默认值 含义 必选 out_r rect_t 输出数据大小信息 transform transformation_t 0 6 0 使用的转换模式 input_roi_r rect_t roi区域 pan int32_t 以输出图像为中心的水平方向目标位移(像素单位) tilt int32_t 以输出图像为中心的垂直方向目标位移(像素单位) zoom double 目标缩放系数 strengthX double x方向变换的非负变换强度参数 strengthY double y方向变换的非负变换强度参数 angle double 主投影轴绕自身旋转的角度 elevation double 指定主投影轴的角度 azimuth double 指定主投影轴的角度,从北方向顺时针计数 keep_ratio int32_t 在水平方向和垂直方向保持相同的拉伸强度 FOV_h double 输出视场的垂直尺寸以度数表示 FOV_w double 输出视场的水平尺寸以度数表示 cylindricity_y double 目标在垂直方向上的投影形状的圆柱度水平 cylindricity_x double 目标在水平方向上的投影形状的圆柱度水平 custom_file[128] char custom模式下的自定义转换描述文件 custom custom_tranformation_t 自定义模式下的转换信息 trapezoid_left_angle double 梯形底与斜边之间的左锐角 trapezoid_right_angle double 梯形底与斜边之间的右锐角 check_compute uint8_t 暂时无用 -
typedef struct rect_s rect_t
名称 类型 最小值 最大值 默认值 含义 必选 x int32_t 起始点x坐标 y int32_t 起始点y坐标 w int32_t 宽度 h int32_t 高度 -
typedef enum gdc_transformation transformation_t
名称 类型 最小值 最大值 默认值 含 义 必选 PANORAMIC enum 全景变 换 CYLINDRICAL enum NA STEREOGRAPHIC enum 畸变校正与全景变换相同,但输出图像是圆柱全景图,而不是平 面图 UNIVERSAL enum Equidistant 等距变 换 CUSTOM enum 用户定制的变换,可定制用于变换的网 格 AFFINE enum 线性变 换 DEWARP_KEYSTONE enum 相对于等距变换,可选择非等距。等距变换 Equidistant 是其 一种特殊情况 -
typedef struct point_s point_t
名称 类型 最小值 最大值 默认值 含义 必选 x double x 坐标 y double y 坐标 -
typedef struct custom_tranformation_s custom_tranformation_t
名称 类型 最小值 最大值 默认值 含义 必选 full_tile_calc uint8_t 是否开启分块计算;如果 使能 fulltile,libgdcbin 会额外分块做 min/max 计算,tile 越多,精度越高,效果越好,但生成 bin 的时间也越长 tile_incr_x uint16_t tile increase in x tile_incr_y uint16_t tile increase in y w int32_t 自定义转换网格中水平方向上的数字或点 h int32_t 自定义转换网格中垂直方向上的数字或点 centerx double 沿 x 轴的中心,通常是水平方向坐标点数的一半 centery double 沿 y 轴的中心,通常是垂直方向坐标点数的一半 *points point_t config.txt
中定义的转换点序列,数量 =w * h
STITCH
简介
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
硬件拼接示意图
通过使用图片上的两个源ROI进行不同blend mode的拼接,最终输出对应的ROI结果
拼接方案介绍
硬件拼接功能可以完成将多张图片拼接融合生成一张图片。硬件上设计灵活,以ROI为基本处理单位,基于alpha blend算法,使用不同的配置字参数划分出不同的ROI划分区域灵活的配置生成多种不同的拼接方案,并且运用LUT表处理拼接的过渡区域优化效果,在自动驾驶以及ADAS的APA场景下,可以将四路摄像头已经被畸变矫正过后的IPM图像数据拼接成一路360环视图,用于停车位的检测,方便用户查看车位线周边情况进行停车。
典型场景
在APA场景,四路环视泊车,GDC从DDR中获取4张回灌图片和参考点(CFG
BIN)通过畸变矫正输出4张IPM图,然后通过STITCH硬件拼接模块使用预先定义好的配置字拼接方案参数(CPG
PARAM)进行硬件拼接输出鸟瞰图。
摆放位置
- 四张IPM图通过copy模式放到指定输出地址的指定位置
- 没有重合的区域可以使用直接拷贝模式
- ROI重合区域使用Alpha Blend模式进行融合拼接
LUT表
LUT表存放的是alpha/beta融合参数系数,类似权重值,每个ROI都要生成对应像素点的融合参数系数,范围0-255,依次存放进LUT表的内存中, 当ROI的拼接模式使用alpha和beta融合时候,会使用该参数进行融合。
比如 坐标点参数举例章节中的LUT生成: ROI-0/1: 256512 ROI-2/3: 560256 ROI-4/5:256218 ROI-6/7:256186 LUT:ROI-0 + ROI-1 + ROI-2 + ROI-3 + ROI-4 + ROI-5 + ROI-6 + ROI-7 目前LUT表可以通过convert_tool工具生成。
坐标点参数举例
硬件拼接的ROI的划分与相机的安装位置有直接关系,目前可以通过convert-tool工具生成,下图为各ROI划分区域坐标点显示示例。
ROI | 范围 | SRC0 | 起点 | 大小 | SRC1 | 起点 | 大小 | 目标起点 | 模式 |
---|---|---|---|---|---|---|---|---|---|
0 | 左视全图 | 左视(frame0) | (0,0) | -256,512 | / | / | / | (0,40) | 直接拷贝 |
1 | 右视全图 | 右视(frame2) | (0,0) | -256,512 | / | / | / | (304,40) | 直接拷贝 |
2 | 后视全图 | 后视(frame3) | (0,0) | -560,256 | / | / | / | (0,366) | 直接拷贝 |
3 | 前视全图 | 前视(frame1) | (0,0) | -560,256 | / | / | / | (0,0) | 直接拷贝 |
4 | 左视与前视重合 | 左视(frame0) | (0,0) | -256,218 | 前视(frame1) | (0,40) | -256,218 | (0,40) | AlphaBlend |
5 | 右视与前视重合 | 右视(frame2) | (0,0) | -256,218 | 前视(frame1) | (304,40) | -256,218 | (304,40) | AlphaBlend |
6 | 左视与后视重合 | 左视(frame0) | (0,366) | -256,186 | 后视(frame3) | (0,0) | -256,186 | (0,366) | AlphaBlend |
7 | 右视与后视重合 | 右视(frame2) | (0,366) | -256,186 | 后视(frame3) | (304,0) | -256,218 | -304,366 | AlphaBlend |
数据流和性能指标
RDK-S100 接入camera 后,进入后级模块处理,其数据流通路如下图所示:
- MIPI RX: 3路 CDPHY,每路为 DPHY 最大 4.5Gbps/lane x 4lane 或 CPHY 最大 3.5Gbps/trio x 3trio,每路支持4VC,理论最多支持 12 路接入 。
RDK-S100 软件预计最大支持 6路 camera,RX4 通过 serdes 最多可接入 4 路 camera,RX0 和 RX1 各接入 1路 camera,如果不是这种常规接法,请联系 FAE 进行确认。 |
---|
-
CIM: RX 接入,可 online 输出到 ISP0/ISP1(RAW) 与 PYM0/PYM1(YUV),也可 offline 下 DDR,之后各模块通过 DDR 读取使用数据流。
-
ISP: 2 个 ISP 设备,各支持 4 路 online + 8 路 offline 输入,每个 ISP 最大支持 2x4K@60fps 处理。
-
PYM: 3 个 PYM 设备,其中 PYM0/PYM1 为全功能模块支持 online/offline,PYM4 只支持 offline,4K@60fps处理。
-
GDC: 1 个 GDC 设备,只支持 offline 方式,4K@60fps 处理。
CIM | ISP0 / ISP1 | PYM0 / PYM1 | PYM4 | GDC | YNR | STITCH | |
---|---|---|---|---|---|---|---|
1080P处理每帧耗时 | 3.7151 ms | 1.8616 ms | 2.2373 ms | 2.7616 ms | 3.7447 ms | 1.7774 ms | 1.5739 ms |
4k处理每帧耗时 | 14.8606 ms | 7.4467 ms | 7.1356 ms | 10.7018 ms | 15.0624 ms | 7.1096 ms | 5.7349 ms |
已点亮sensor
类型 | sensor name | 备注 |
---|---|---|
MIPI sensor | IMX219 | raw10 1080p |
GMSL sensor | 0820c | yuv 4k & 1080p |
OVX3C | raw12 1280P | |
OVX8B | raw12 4K |