光流处理示例
光流处理示例使用了 hbVPPyrDown, hbVPCornerHarris 和 hbVPOpticalFlowPyrLK 接口,涉及到LKOF和DSP硬件IP,展示了如何对连续帧图像进行光流追踪,详细的实现方法请结合示例源码对比实践。
功能概述

该示例实现的功能是对连续帧的图像输入进行特征点跟踪,输入图像是NV12类型,转成gray类型后使用 hbVPPyrDown 生成5层金字塔图层。
第一帧使用 hbVPCornerHarris 生成harris角点,后续帧会使用 hbVPOpticalFlowPyrLK 对第一帧生成的角点进行跟踪,每隔5帧会再次调用 hbVPCornerHarris 生成先验特征点用于校准跟踪结果。
该示例的代码过程可以大致分为以下四个步骤,详细的实现请结合示例源码。
-
分配输入图像和输入输出特征点的内存。
-
准备光流计算参数。
-
依次执行每一帧的计算,包括生成金字塔图层,角点检测和光流追踪。
-
释放内存资源。
运行指南
光流处理示例执行脚本位于 ucp_tutorial/vp/vp_samples/script/04_optical_flow 目录下,包含以下脚本:
04_optical_flow
├── README.md
└── run_optical_flow.sh
run_optical_flow.sh脚本中命令行内容如下:
bin=../aarch64/bin/optical_flow_sample
lib=../aarch64/lib
export LD_LIBRARY_PATH=${lib}:${LD_LIBRARY_PATH}
export PATH=${bin}:${PATH}
export HB_DSP_ENABLE_DIRECT_MODE=true
export HB_DSP_ENABLE_CONFIG_VDSP=true
export HB_DSP_LOG_LEVEL=3
export HB_DSP_VDSP_LOG_LEVEL=3
# Usage: ${bin} <image_file_list> <frame_num> <lkof_threshold> <harris_top_k>
${bin} ../../data/frame_images/images.list 10 5 5
命令行参数含义如下:
- $ {bin} :编译好的可执行文件。
- image_file_list:输入图像列表。
- frame_num:运行的帧数,可根据实际需求调整计算的帧数。
- lkof_threshold:光流置信度阈值,用于筛选光流计算结果,用户可自行调整。
- harris_top_k:用于筛选前top k角点计算结果,用户可自行调整。
使用的时候,进入 vp_samples/script/04_optical_flow 目录,然后直接执行run_optical_flow.sh即可,执行方法及日志输出如下:
#!/bin/sh
root@j6dvb:/userdata/app/horizon/vp_samples/script/04_optical_flow# sh run_optical_flow.sh
[I][9150][08-09][15:13:49:256][optical_flow.cpp:289][optical_flow_sample][SAMPLE] frame [0] tracking end.
...
结果说明
示例运行结束后会在 vp_samples/script/04_optical_flow 目录下生成可视化图像,本示例的生成物内容如下:
04_optical_flow
├── lkof_1.jpg
├── lkof_2.jpg
├── lkof_3.jpg
├── lkof_4.jpg
├── lkof_5.jpg
├── lkof_6.jpg
├── lkof_7.jpg
├── lkof_8.jpg
├── lkof_9.jpg
├── README.md
└── run_optical_flow.sh
其中第一帧会显示harris特征点检测结果,后续帧会显示光流追踪轨迹,其中蓝色点为前一帧图像的特征点,红色点为当前帧图像的特征点,绿色是光流轨迹。第一帧和第n帧的追踪效果如下所示:
| 第一帧 | 第n帧 |
|---|
 |  |
注意
- 该示例的PyrDown和CornerHarris计算都是在DSP上进行处理的,请提前配置好DSP环境。
- 如需替换图片,请保证替换的输入图片为连续帧图像,否则光流计算的结果可能会不准确。