1. PYM模块简述:
1.1 硬件数据流:
PYM(Pyramid)作为一个硬件加速模块(图像缩小及ROI提取),对输入的图像按照金字塔图层的方式处理,并输出到DDR:

PYM模块在Camsys子系统的数量和位置如下,总共3个PYM硬件,PYM0、PYM1、PYM4(只支持offline)。

1.2 PYM-Sample软件架构:
本文的demo sample采用回灌流程,即从系统存储中读取文件,作为PYM的输入图像。 调用VIO API实现整个数据通路初始化并完成PYM处理。

1.3 PYM-Sample:
1.3.1 API调用流程:

1.3.2 Sample源码解析:


get_opts_for_pym():配置参数
配置pym设备参数,下面是具体参数说明:

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返回的信息。
pym_feedback_worker_func:
int32_t hb_vio_get_data(uint32_t pipeline_id, VIO_DATA_TYPE_E data_type, void *data):
单进程:根据管道句柄和类型获取信息;
多进程:发送获取数据命令给server,接受返回的信息。
int read_yuv420_file(const char *filename, char *addr0, char *addr1, uint32_t y_size):
解析yuv文件信息。
int32_t hb_vio_run_pym(uint32_t pipeline_id, hb_vio_buffer_t *src_img_info):
单进程:将缓冲区类型从 VIO 缓冲区转换为 VNODE 实体,将图像数据转换为帧描述符格式排入设备队列并轮询以获取结果。
多进程:获取图像缓冲区的地址,向server发送空闲pym信息,接受server返回的信息。
int32_t hb_vio_free_pymbuf(uint32_t pipeline_id, VIO_DATA_TYPE_E data_type, void *img_info):
单进程:根据管道id和类型释放内存。
多进程:向server发送释放内存命令,接受返回信息。
2. Sample使用:
2.1 编译:
获取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源码到新建文件夹pym并构建新Makefile:
*cfg和res也拷贝到该目录
Makefile:
执行make完成编译,生成的文件为./programD

2.2 文件传输:
使用WinScp将vpm_config.json、4k.yuv和program传输到单板上。
2.3 运行
通过ssh或串口进入/home/hobot/执行:
Sample运行时日志:
生成的缩放yuv文件存放在程序执行目录下。
检查生成的yuv文件,本文档使用YUView:*请用户自行下载
将生成的文件传输给window

使用YUView打开:

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



