hi_mpi_vpc_flip
hi_mpi_vpc_get_rotation_matrix
函数功能
获取仿射变换需要的旋转矩阵。
函数原型
hi_s32 hi_mpi_vpc_get_rotation_matrix(****hi_float_point center_point, hi_double angle, hi_double scale, hi_transform_matrix *matrix)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| center_point | 输入 | 输入图像的旋转中心点。 |
| angle | 输入 | 旋转角度,正值表示逆时针旋转。 |
| scale | 输入 | 缩放参数。 scale参数值大于1表示放大图片,参数值小于1表示缩小图片。 |
| matrix | 输出 | 仿射变换的旋转矩阵。 |
返回值说明
- 0:成功
- 非0:失败,VPC图像处理返回码
父主题: VPC图像处理功能
hi_mpi_vpc_warp_affine
函数功能
对输入图片做仿射变换。
约束说明
-
输入、输出图片分辨率的取值范围为:10*6~4096*8192。
-
关于输入、输出图片格式的要求如下(关于图片宽高对齐、内存等约束,请参见约束说明):
版本 约束 Atlas 200/500 A2推理产品 - 支持如下输入图片格式:
text<br> HI_PIXEL_FORMAT_YUV_400 = 0, // YUV400 8bit<br> HI_PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, // YUV420SP NV12 8bit <br> HI_PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2, // YUV420SP NV21 8bit <br> HI_PIXEL_FORMAT_RGB_888 = 12, // RGB888<br> HI_PIXEL_FORMAT_BGR_888 = 13, // BGR888<br> HI_PIXEL_FORMAT_YUV_PACKED_444 = 11, // YUV444P 8bit<br> HI_PIXEL_FORMAT_YVU_PACKED_444 = 58, // YVU444P 8bit<br>
- 支持如下输出图片格式:
text<br> HI_PIXEL_FORMAT_YUV_400 = 0, // YUV400 8bit<br> HI_PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, // YUV420SP NV12 8bit <br> HI_PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2, // YUV420SP NV21 8bit <br> HI_PIXEL_FORMAT_RGB_888 = 12, // RGB888<br> HI_PIXEL_FORMAT_BGR_888 = 13, // BGR888<br> HI_PIXEL_FORMAT_YUV_PACKED_444 = 11, // YUV444P 8bit<br> HI_PIXEL_FORMAT_YVU_PACKED_444 = 58, // YVU444P 8bit<br> HI_PIXEL_FORMAT_YUYV_PACKED_422 = 7, // YUV422P YUYV 8bit <br> HI_PIXEL_FORMAT_UYVY_PACKED_422 = 8, // YUV422P UYVY 8bit<br> HI_PIXEL_FORMAT_YVYU_PACKED_422 = 9, // YUV422P YVYU 8bit <br> HI_PIXEL_FORMAT_VYUY_PACKED_422 = 10, // YUV422P VYUY 8bit <br> -
在任务执行过程中,需要临时缓存,因此每个通道第一次执行本接口前需先调用hi_mpi_vpc_set_chn_workspace接口申请内部临时缓存。
-
由于YUV格式图像下采样约束,当输出图片格式为YUV420SP或YUV422SP格式时,在配置边界填充类型时,建议设置为“边界复制模式”,避免输出图片边缘异常数据。
函数原型
hi_s32 hi_mpi_vpc_warp_affine(hi_vpc_chn chn, hi_transform_matrix *matrix**, hi_warp_transform_param *transform_param, hi_u32 *task_id, hi_s32 milli_sec)**
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 图片处理通道号。 Atlas 200/500 A2推理产品,该参数的取值范围:[0, 128),通道总数最多128。 |
| matrix | 输入 | 使用hi_mpi_vpc_get_affine_transform或者hi_mpi_vpc_get_rotation_matrix接口获取的仿射变换矩阵。 |
| transform_param | 输入 | 仿射变换参数,在hi_warp_transform_param结构体内配置输入、输出图片信息。 |
| milli_sec | 输入 | 超时时间配置,单位是毫秒,取值范围如下: - -1:阻塞方式 - 0:非阻塞方式 - >0:超时方式,配置具体的超时时间。超时时间受操作系统影响,一般偏差在操作系统的一个时间片内,例如,操作系统的一个时间片为4ms,用户设置的milli_sec参数值为1,则实际的超时时间在1ms到5ms范围内。在CPU负载高场景下,超时时间仍可能存在波动。 |
| task_id | 输出 | 任务ID的指针,用来区分任务。 |
返回值说明
- 0:成功
- 非0:失败,VPC图像处理返回码
父主题: VPC图像处理功能
hi_mpi_vpc_flip
函数功能
对输入图片做翻转处理,支持水平方向翻转、竖直方向翻转和水平竖直方向同时翻转。
约束说明
-
输入、输出图片分辨率的取值范围为:10*6~4096*8192,且输入、输出图片的分辨率需保持一致。
-
支持如下输入图片格式:(输出格式需与输入保持一致)
HI_PIXEL_FORMAT_YUV_400 = 0, // YUV400 8bitHI_PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, // YUV420SP NV12 8bitHI_PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2, // YUV420SP NV21 8bitHI_PIXEL_FORMAT_YUV_SEMIPLANAR_422 = 3, // YUV422SP 8bitHI_PIXEL_FORMAT_YVU_SEMIPLANAR_422 = 4, // YVU422SP 8bitHI_PIXEL_FORMAT_YUYV_PACKED_422 = 7, // YUV422Packed YUYV 8bitHI_PIXEL_FORMAT_UYVY_PACKED_422 = 8,// YUV422Packed UYVY 8bitHI_PIXEL_FORMAT_YVYU_PACKED_422 = 9, // YUV422Packed YVYU 8bitHI_PIXEL_FORMAT_VYUY_PACKED_422 = 10,// YUV422Packed VYUY 8bitHI_PIXEL_FORMAT_YUV_PACKED_444 = 11, // YUV444 Package 8bitHI_PIXEL_FORMAT_RGB_888 = 12, // RGB888HI_PIXEL_FORMAT_BGR_888 = 13, // BGR888HI_PIXEL_FORMAT_ARGB_8888 = 14,// ARGB_8888HI_PIXEL_FORMAT_ABGR_8888 = 15,// ABGR_8888HI_PIXEL_FORMAT_RGBA_8888 = 16,// RGBA_8888HI_PIXEL_FORMAT_BGRA_8888 = 17,// BGRA_8888HI_PIXEL_FORMAT_YVU_PLANAR_444 = 22,// YVU444 Planar 8bitHI_PIXEL_FORMAT_YVU_PACKED_444 = 58, // YVU444 Package 8bitHI_PIXEL_FORMAT_RGB_888_PLANAR = 69, // RGB888 PlanarHI_PIXEL_FORMAT_BGR_888_PLANAR = 70, // BGR888 Planar
函数原型
hi_s32 hi_mpi_vpc_flip(hi_vpc_chn chn, hi_flip_param* flip_param, hi_u32* task_id, hi_s32 milli_sec)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 图片处理通道号。 Atlas 200/500 A2推理产品,该参数的取值范围:[0, 128),通道总数最多128。 |
| flip_param | 输入 | 翻转信息。 在hi_flip_param结构体内配置输入、输出图片信息以及翻转模式。 |
| milli_sec | 输入 | 超时时间配置,单位是毫秒,取值范围如下: - -1:阻塞方式 - 0:非阻塞方式 - >0:超时方式,配置具体的超时时间。超时时间受操作系统影响,一般偏差在操作系统的一个时间片内,例如,操作系统的一个时间片为4ms,用户设置的milli_sec参数值为1,则实际的超时时间在1ms到5ms范围内。在CPU负载高场景下,超时时间仍可能存在波动。 |
| task_id | 输出 | 任务ID的指针,用来区分任务。 |
返回值说明
- 0:成功
- 非0:失败,VPC图像处理返回码
父主题: VPC图像处理功能
hi_mpi_vpc_set_chn_opt_attr
函数功能
设置通道可选属性,目前仅支持设置通道优先级。
约束说明
-
针对同一通道,本接口只允许在创建通道后调用一次,对同一通道重复调用将会返回失败;
-
通道优先级只能将通道设置为高优先级,不调用本接口则默认为低优先级;
针对不同通道,如果都设置为高优先级,则这些通道的任务按下发顺序调用。
-
高优先级通道中的任务会被优先调度,但不会影响已下发的低优先级通道的任务;
建议在高优先级通道中只下发需要处理时延敏感的关键任务,避免高优先级通道中的任务长时间占用VPC资源而导致低优先级通道中任务一直排队等待。
-
VDEC任务中也会调用VPC资源,其默认使用低优先级,设置VPC的通道优先级也会对VDEC任务中的VPC资源调度产生影响;
函数原型
hi_s32 hi_mpi_vpc_set_chn_opt_attr(hi_vpc_chn chn, const hi_opt_attr* opt_attr)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 图片处理通道号。 Atlas 200/500 A2推理产品,该参数的取值范围:[0, 128),通道总数最多128。 |
| opt_attr | 输入 | 通道可选属性信息。 |
返回值说明
- 0:成功
- 非0:失败,VPC图像处理返回码
父主题: VPC图像处理功能
JPEGD功能及约束说明
功能说明
JPEGD(JPEG Decoder)实现.jpg、.jpeg、.JPG、.JPEG图片文件的解码。
-
JPEGD在解码图片时,支持对图片进行旋转。
如果输入图片的码流中包含Orientation信息(代表捕获图像时摄像机相对于场景的方向),则JPEGD在解码时会解析Orientation信息,将图片进行90度、180度、270度或镜像旋转。旋转后输出图片的宽stride、高stride、输出内存仍需满足图片格式、宽高对齐、内存约束中的要求。如果输入图片的码流异常,导致JPEGD解码时无法读取Orientation信息,则不能实现图片旋转的功能。
:::note 说明 Atlas 200/500 A2推理产品上,JPEGD 422格式旋转图片,若原图高为奇数,并且旋转方式为宽高对换,则旋转后宽存在黑边,建议用户将宽向下对齐到偶数使用(即去除黑边),比如原图为200*101,若旋转后为101*200,则建议用户实际使用区域为100*200。
Atlas 200/500 A2推理产品上,JPEGD 440格式旋转图片,若原图宽为奇数,并且旋转方式为宽高对换,则旋转后高存在黑边,建议用户将高向下对齐到偶数使用(即去除黑边),比如原图为201*101,若旋转后为100*201,则建议用户实际使用区域为100*200。
JPEGD 422格式旋转图片,若原图高为奇数,并且旋转方式为宽高对换,则旋转后宽存在黑边,建议用户将宽向下对齐到偶数使用(即去除黑边),比如原图为200*101,若旋转后为101*200,则建议用户实际使用区域为100*200。
JPEGD 440格式旋转图片,若原图宽为奇数,并且旋转方式为宽高对换,则旋转后高存在黑边,建议用户将高向下对齐到偶数使用(即去除黑边),比如原图为201*101,若旋转后为100*201,则建议用户实际使用区域为100*200。 :::
-
JPEGD在解码图片时,支持按源图片格式解码。
源图片格式解码是指解码前后图片的编码格式保持一致,例如解码前输入图片为jpeg(440),解码后输出图片为YUV440SP V在前U在后或YUV440SP U在前V在后。
使用源图片格式解码,有以下方式:
-
在调用JPEGD解码接口时,直接将输出图片格式配置为HI_PIXEL_FORMAT_UNKNOWN,输出格式默认按源图片格式输出、且是V在前U在后的Semi-Planar格式。例如,JPEG源图片格式为jpeg(440),输出图片格式配置为HI_PIXEL_FORMAT_UNKNOWN,JPEGD解码后,实际输出图片格式为YUV440SP V在前U在后。
此种方式,由于不知道输出图片格式,因此需要用户申请尽量大的内存或调用hi_mpi_dvpp_get_image_info接口获取解码输出内存大小,防止内存不够,无法存放输出图片。
-
先调用hi_mpi_dvpp_get_image_info接口根据传入的jpeg源图片,获取按源图解码时的输出图片的宽、高、宽stride、高stride、解码输出内存大小、图片格式等信息后,再调用JPEGD解码接口,使用通过hi_mpi_dvpp_get_image_info接口获取的图片格式来设置输出图片格式。
:::note 说明 JPEGD解码后的输出图片,如果要直接作为模型推理的输入,建议将输出图片格式配置为HI_PIXEL_FORMAT_UNKNOWN,这时JPEGD使用源图片格式解码(但这里要确保解码后的图片格式模型是支持的),保证模型推理的精度。
JPEGD解码后的输出图片,如果直接作为VPC的输入,该场景下若使用源图片格式解码时,则需要关注解码后的输出图片格式VPC是否支持(VPC输入图片的格式请参见约束说明),如果VPC不支持,则用户需按VPC支持的情况指定JPEGD的输出图片格式。 :::
-
图片分辨率约束
-
输入图片分辨率
版本 分辨率范围 Atlas 200/500 A2推理产品 最大分辨率:16384*16384,最小分辨率:32*32。 -
输出图片分辨率
JPEGD只对图片解码,不会改变图片分辨率,因此输出与输入的图片分辨率保持一致。
内存申请/释放接口说明
输入内存的大小就是指实际的输入图片所占用的大小,输出内存的大小参见表1中的计算公式。
| 版本 | 内存申请接口 |
|---|---|
| Atlas 200/500 A2推理产品 | JPEGD图片解码时,支持以下两种内存申请接口: - 调用aclrtMalloc[aclrtFree](./aclcppdevg_03_0101.md)接口申请\释放Device上的输入、输出内存,这部分内存的生命周期由用户自行管理。 - 调用hi_mpi_dvpp_malloc[hi_mpi_dvpp_free](./aclcppdevg_03_0726.md)接口申请\释放Device上的输入、输出内存,这部分内存的生命周期由用户自行管理。 注意:调用hi_mpi_dvpp_malloc接口申请的内存为媒体数据处理的专用内存,但专用内存的地址空间有限,若关注内存规划或内存资源有限时,建议调用aclrtMalloc接口申请内存。 |
图片格式、宽高对齐、内存约束
实现JPEGD图片解码功能时,仅支持Huffman编码,压缩前的原图像色彩空间为YUV,像素的各分量比例为4:4:4或4:2:2或4:2:0或4:0:0或4:4:0,不支持算术编码、不支持渐进JPEG格式、不支持JPEG2000格式。
:::note 说明 输出图片格式的定义请参见hi_pixel_format,宽stride、高stride等概念请参见基本概念。 :::
表1 图片格式、宽高对齐、内存大小约束
输入图片格式(YUV分量比例) | 输出图片格式 | 输出图片宽、高对齐要求 | 输出图片宽stride、高stride、内存大小要求 |
|---|---|---|---|
jpeg(444) | YVU444SP 8bit | 无对齐要求 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3 |
YUV444SP 8bit | |||
YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 | |
YUV420SP NV21 8bit | |||
jpeg(422) | YVU422SP 8bit | 宽2对齐 高无对齐要求 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 2 |
YUV422SP 8bit | |||
YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 | |
YUV420SP NV21 8bit | |||
jpeg(420) | YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 |
YUV420SP NV21 8bit | |||
jpeg(400) | YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 |
YUV420SP NV21 8bit | |||
YUV400 8bit | 无对齐要求 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride | |
jpeg(440) | YVU440SP 8bit | 宽无对齐要求 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 2 |
YUV440SP 8bit | |||
YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 | |
YUV420SP NV21 8bit |
软、硬件约束
- 硬件约束:
- 最多支持4张Huffman表,其中包括2 张DC(Direct Current)(直流)表和2 张AC(Alternating Current)(交流)表;
- 最多支持3张量化表;
- 只支持8bit采样精度;
- 只支持对顺序式编码的图片进行解码;
- 只支持基于DCT(Discrete Cosine Transform)变换的JPEG 格式解码;
- 只支持一个SOS(Start of Scan)标志的图片解码。
- 软件约束:
- 支持3个SOS标志的图片解码;
- 支持mcu(Minimum Coded Unit)数据不足的异常图片解码。
精度相关约束
JPEGD+VPC串联使用时,由于JPEGD解码后的输出图片的宽stride*高stride有64*16对齐的约束,因此解码后的输出图片的宽、高有一些补边的无效数据,所以在执行VPC功能时(例如缩放时),需在输入图片的hi_vpc_pic_info.picture_width、hi_vpc_pic_info.picture_height参数处正确设置输入图片的原图宽高,这样VPC在缩放图片前会先根据原图宽高自行抠图,目的是去除无效数据对图像精度的影响。
其它注意事项
若图片内EOI(End Of Image,标记代码为0XFFD9)之后,还有用户自定义的数据,则JPEGD在对图片进行解码时,会直接清零EOI之后的8字节数据,若用户需要保留这些自定义的数据,则将图片数据读入内存之后,需要提前备份这部分数据,再传给JPEGD处理。
若需要查看图片内EOI之后是否存在自定义数据,可以使用二进制查看工具打开图片查看,例如下图中的FFD9标记符之后就存在自定义数据。

在线提单