专栏算法工具链征程6E/M快速上手实战Sample-PYM

征程6E/M快速上手实战Sample-PYM

六朝金粉地2024-08-01
292
0

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传输到单板上。

*WinScp使用方法请参考征程6E/M底软开发Sample-IPC 2.1.2

2.3 运行

通过ssh或串口进入/home/hobot/执行:

Sample运行时日志:

生成的缩放yuv文件存放在程序执行目录下。

检查生成的yuv文件,本文档使用YUView:*请用户自行下载

将生成的文件传输给window

使用YUView打开:

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

算法工具链
征程6社区征文官方教程
评论0
0/1000