光流处理示例

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

功能概述

image

该示例实现的功能是对连续帧的图像输入进行特征点跟踪,输入图像是NV12类型,转成gray类型后使用 hbVPPyrDown 生成5层金字塔图层。 第一帧使用 hbVPCornerHarris 生成harris角点,后续帧会使用 hbVPOpticalFlowPyrLK 对第一帧生成的角点进行跟踪,每隔5帧会再次调用 hbVPCornerHarris 生成先验特征点用于校准跟踪结果。

该示例的代码过程可以大致分为以下四个步骤,详细的实现请结合示例源码。

  1. 分配输入图像和输入输出特征点的内存。

  2. 准备光流计算参数。

  3. 依次执行每一帧的计算,包括生成金字塔图层,角点检测和光流追踪。

  4. 释放内存资源。

运行指南

光流处理示例执行脚本位于 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帧
imageimage
注意
  1. 该示例的PyrDown和CornerHarris计算都是在DSP上进行处理的,请提前配置好DSP环境。
  2. 如需替换图片,请保证替换的输入图片为连续帧图像,否则光流计算的结果可能会不准确。