跳到主要内容

5.2.4 图像处理加速

高斯滤波

功能介绍

实现高斯滤波功能,加速类型分为 BPU 加速和 NEON 加速,BPU 加速暂时只支持 int16 格式,NEON 加速暂时只支持 int16 和 uint16 格式。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式示例功能
RDK X3, RDK X3 ModuleUbuntu 20.04 (Foxy), Ubuntu 22.04 (Humble)读取 ToF 图片,进行高斯滤波

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

使用介绍

BPU 加速

当前版本支持的参数范围如下:

  • 滤波类型:高斯滤波

  • 支持的数据类型:int16

  • 支持的分辨率:320x240。

  • 滤波核:高斯 3x3

  • sigmax: 0

  • sigmay: 0

NEON 加速

当前版本支持的参数范围如下:

  • 滤波类型:高斯滤波

  • 支持的数据类型:int16、uint16

  • 滤波核:高斯 3x3,5x5

  • sigmax: 0

  • sigmay: 0

package 中提供了简单测试程序,输入为本地的 ToF 图片,调用 hobot_cv 中接口实现高斯滤波功能。具体接口说明可参考 hobot_cv pakcage 中的 README.md 进一步了解。

RDK 平台

# 配置tros.b环境
source /opt/tros/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的模型和配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动BPU加速测试程序pkg
ros2 launch hobot_cv hobot_cv_gaussian_blur.launch.py

# 启动NEON加速测试程序pkg
ros2 launch hobot_cv hobot_cv_neon_blur.launch.py

结果分析

BPU 加速

输出结果:

===================
image name :images/frame1_4.png
infe cost time:1314
guss_time cost time:2685
hobotcv save rate:0.510615

analyse_result start
---------GaussianBlur
out_filter type:2,cols:320,rows:240,channel:1
cls_filter type:2,cols:320,rows:240,channel:1
out_filter minvalue:96,max:2363
out_filter min,x:319,y:115
out_filter max,x:147,y:239
cls_filter minvalue:96,max:2364
cls_filter min,x:319,y:115
cls_filter max,x:147,y:239

diff diff diff
mat_diff minvalue:0,max:2
mat_diff min,x:2,y:0
mat_diff max,x:110,y:14

error sum:8.46524e+06,max:2,mean_error:0.439232
analyse_result,time_used_ms_end:2
analyse_result end

-------------------------

其中:

infe cost time:1314 //表示 hobotcv 加速的高斯滤波耗时 1314 微秒。

guss_time cost time:2685 //表示 opencv 的高斯滤波耗时 2685 微秒。

hobotcv save rate = (guss_time cost time - infe cost time)/ guss_time cost time = 0.510615

从以上比较结果,经过 hobot_cv 加速后性能提升 50%。

error sum:8.46524e+06,max:2,mean_error:0.439232 //单张图片总误差是:8.46524e+06,单个像素最大误差是:2,平均误差:0.439232

平均误差 = sum / (width height) = 8.46524e+06 / (320 240)

hobot_cv 高斯滤波 BPU 加速与 opencv 高斯滤波性能对比结果如下:

接口类型滤波核大小耗时(ms)单核 CPU 占比(%)
Hobotcv gaussianSize(3,3)1.1043515.9
Opencv gaussianSize(3,3)2.4186149.7

NEON 加速

输出结果:
[neon_example-1] ===================
[neon_example-1] image name :config/tof_images/frame1_4.png
[neon_example-1] hobotcv mean cost time:674
[neon_example-1] opencv mean cost time:1025
[neon_example-1] hobotcv mean save rate:0.342439
[neon_example-1]
[neon_example-1] analyse_result start
[neon_example-1] ---------Mean_Blur
[neon_example-1] error sum:8.43744e+06,max:1,mean_error:0.430833
[neon_example-1]
[neon_example-1] hobotcv gaussian cost time:603
[neon_example-1] opencv gaussian cost time:2545
[neon_example-1] hobotcv gaussian save rate:0.763065
[neon_example-1]
[neon_example-1] analyse_result start
[neon_example-1] ---------Gaussian_Blur
[neon_example-1] error sum:9.13206e+06,max:1,mean_error:0.466302
[neon_example-1]
[neon_example-1] -------------------------

hobotcv gaussian cost time:603 //hobotcv 高斯滤波 neon 加速接口耗时 603 微秒。 opencv gaussian cost time:2545 //表示 opencv 的高斯滤波耗时 2545 微秒。 hobotcv gaussian save rate = (opencv cost time - hobotcv cost time)/ opencv cost time = 0.763065 从以上比较结果,经过 hobotcv 加速后高斯滤波性能提升 76%。

hobot_cv 高斯滤波 NEON 加速与 opencv 高斯滤波性能对比结果如下:

接口类型滤波核大小耗时(ms)单核 CPU 占比(%)
Hobotcv gaussianSize(3,3)0.43028427.1
Opencv gaussianSize(3,3)2.4222547
Hobotcv gaussianSize(5,5)0.85487139.1
Opencv gaussianSize(5,5)3.1564799.8

均值滤波

功能介绍

实现均值滤波功能,加速方式为 NEON 加速,暂时只支持 int16,uint16 格式。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式示例功能
RDK X3, RDK X3 ModuleUbuntu 20.04 (Foxy), Ubuntu 22.04 (Humble)读取 ToF 图片,进行均值滤波

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

使用介绍

当前版本支持的参数范围如下:

  • 滤波类型:均值滤波

  • 支持的数据类型:int16,uint16

  • 滤波核:3x3,5x5

package 中提供了简单测试程序,输入为本地的 ToF 图片,调用 hobot_cv 中接口实现均值滤波功能。具体接口说明可参考 hobot_cv pakcage 中的 README.md 进一步了解。

RDK 平台

# 配置tros.b环境
source /opt/tros/setup.bash
# 从TogetheROS的安装路径中拷贝出运行示例需要的配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动测试程序pkg
ros2 launch hobot_cv hobot_cv_neon_blur.launch.py

结果分析

输出结果:
[neon_example-1] ===================
[neon_example-1] image name :config/tof_images/frame1_4.png
[neon_example-1] hobotcv mean cost time:674
[neon_example-1] opencv mean cost time:1025
[neon_example-1] hobotcv mean save rate:0.342439
[neon_example-1]
[neon_example-1] analyse_result start
[neon_example-1] ---------Mean_Blur
[neon_example-1] error sum:8.43744e+06,max:1,mean_error:0.430833
[neon_example-1]
[neon_example-1] -------------------------

其中:

hobotcv mean cost time:674 //hobot_cv 均值滤波 neon 加速接口耗时 674 微秒。 opencv mean cost time:1025 //表示 opencv 的均值滤波耗时 1025 微秒。 hobotcv mean save rate = (opencv cost time - hobotcv cost time)/ opencv cost time = 0.342439 从以上比较结果,经过 hobotcv 加速后均值滤波性能提升 34%

error sum:8.43744e+06,max:1,mean_error:0.430833 //均值滤波单张图片总误差是:8.43744e+06,单个像素最大误差是:1,平均误差:0.430833 均值滤波平均误差 = sum / (width x height) = 8.43744e+06 / (320 x 240)

hobot_cv 与 opencv 处理性能对比

接口类型滤波核大小耗时(ms)单核 CPU 占比(%)
Hobotcv meanSize(3,3)0.46639731.8
Opencv meanSize(3,3)0.67667740.2
Hobotcv meanSize(5,5)0.73717147.7
Opencv meanSize(5,5)0.79817752.9

crop

功能介绍

实现图像裁剪功能,暂时只支持 NV12 格式。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式示例功能
RDK X3, RDK X3 ModuleUbuntu 20.04 (Foxy), Ubuntu 22.04 (Humble)读取图片,进行抠图
RDK X5, RDK X5 ModuleUbuntu 22.04 (Humble)读取图片,进行抠图

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

使用介绍

RDK 平台

# 配置tros.b环境
source /opt/tros/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的模型和配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动launch文件
ros2 launch hobot_cv hobot_cv_crop.launch.py

结果分析

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [crop_example-1]: process started with pid [3064]
[crop_example-1] [INFO] [1655951627.255477663] [example]: crop image to 960x540 pixels, time cost: 1 ms
[crop_example-1] [INFO] [1655951627.336889080] [example]: crop image to 960x540 pixels, time cost: 1 ms
[INFO] [crop_example-1]: process has finished cleanly [pid 3064]

根据 log 显示,测试程序完成了对本地 1920x1080 分辨率图片 crop 的处理,耗时如下:

图片处理运行耗时
1920x1080 crop 出 960x5401ms

本地原图 1920x1080、crop 左上角 960x540 区域,效果图片展示如下:

原图 1920×1080 裁剪左上角 960×540 区域后的效果对比

resize

功能介绍

实现图像缩放功能,暂时只支持 NV12 格式。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式
RDK X3, RDK X3 ModuleUbuntu 20.04 (Foxy), Ubuntu 22.04 (Humble)
RDK X5, RDK X5 ModuleUbuntu 22.04 (Humble)
RDK S100Ubuntu 22.04 (Humble)
RDK S600Ubuntu 24.04 (Jazzy)
X86Ubuntu 20.04 (Foxy)

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

X86 平台

  1. 确认 X86 平台系统为 Ubuntu 20.04,且已成功安装 TogetheROS.Bot。

使用介绍

RDK/X86

# 配置tros.b环境
source /opt/tros/setup.bash
# 配置tros.b环境
source /opt/tros/humble/setup.bash
# 配置tros.b环境
source /opt/tros/jazzy/setup.bash
# 从TogetheROS的安装路径中拷贝出运行示例需要的模型和配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动launch文件
ros2 launch hobot_cv hobot_cv_resize.launch.py

结果分析

RDK X3 平台 resize

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [resize_example-1]: process started with pid [3083]
[resize_example-1] [INFO] [1655951649.930987924] [example]:
[resize_example-1] source image config/test.jpg is 1920x1080 pixels
[resize_example-1] [INFO] [1655951649.931155799] [example]: resize image to 960x540 pixels, time cost: 297 ms
[resize_example-1] [INFO] [1655951650.039223757] [example]: resize image to 960x540 pixels, time cost: 15 ms
[INFO] [resize_example-1]: process has finished cleanly [pid 3083]

根据 log 显示,测试程序完成了对本地 1920x1080 分辨率图片 resize 的处理。接口调用两次,两次耗时分别如下。

图片处理第一次运行耗时第二次运行耗时
1920x1080 resize 到 960x540297ms15ms

因为第一次运行,需要对 vps 硬件进行配置所以耗时较多,如果不再更改硬件配置属性,硬件直接进行处理,耗时就会显著降低。

本地原图 1920x1080、resize 后 960x540 图片如下:

原图 1920×1080 缩放为 960×540 后的效果对比

RDK X3 平台性能对比

使用 top 命令查看 cpu 占用,cpu 占用为测试进程 cpu 占比。 耗时统计单位为 ms,循环处理 1000 次取平均值。 测试时锁定 cpu 频率:

sudo bash -c 'echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor'
src wxhdst wxhvps 耗时vps 接口
cpu 占用
bpu 耗时bpu 接口
cpu 占用
opencv 耗时opencv 处理
cpu 占用
512x512128x1281.5378925.91.11054891.71119100.3
640x640320x3202.4853628.51.82232881.82384338.9
896x896384x3844.5442224.62.8195479.77.84396273.1
1024x1024512x5126.0110325.23.8932581.72.55761381.7
1920x1088512x51211.040620.65.851371.18.19324380.1
1920x1080960x54411.156222.37.0908577.715.2978382.4

rotate

功能介绍

rotate 实现图像旋转功能,暂时只支持 NV12 格式的图片,支持的旋转角度为 90、180、270。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式示例功能
RDK X3, RDK X3 ModuleUbuntu 20.04 (Foxy), Ubuntu 22.04 (Humble)读取图片,进行旋转

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

使用介绍

RDK 平台

# 配置tros.b环境
source /opt/tros/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的模型和配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动launch文件
ros2 launch hobot_cv hobot_cv_rotate.launch.py

结果分析

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [rotate_example-1]: process started with pid [3096]
[rotate_example-1] [INFO] [1655951661.173422471] [example]: rotate image 180 , time cost: 415 ms
[rotate_example-1]
[rotate_example-1] [INFO] [1655951661.416188013] [example]: second rotate image 180 , time cost: 40 ms
[rotate_example-1]
[INFO] [rotate_example-1]: process has finished cleanly [pid 3096]

根据 log 显示,测试程序完成了对本地 1920x1080 分辨率图片 rotate 的处理。接口调用两次,两次耗时分别如下。

图片处理第一次运行耗时第二次运行耗时
1920x1080 旋转 180 度415ms40ms

因为第一次运行,需要对 vps 硬件进行配置所以耗时较多,如果不再更改硬件配置属性,硬件直接进行处理,耗时就会显著降低。

本地原图 1920x1080、rotate 后 1920x1080 图片如下:

用于旋转示例的原始输入图片
原图旋转处理后的输出效果图

hobot_cv 与 opencv 处理性能对比

使用 top 命令查看 cpu 占用,cpu 占用为测试进程 cpu 占比。 耗时统计单位为 ms,循环处理 1000 次取平均值。 测试时锁定 cpu 频率:

sudo bash -c 'echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor'
src wxh旋转角度hobotcv 耗时hobotcv 接口 cpu 占用opencv 耗时opencv 处理 cpu 占用
1920x10809037.656861.655.8886100.0
640x6401807.313366.85.1806100.0
896x89627014.772362.513.6497100.0

pyramid

功能介绍

实现图像金字塔缩放功能,暂时只支持 NV12 格式。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式示例功能
RDK X3, RDK X3 ModuleUbuntu 20.04 (Foxy), Ubuntu 22.04 (Humble)读取图片,进行金字塔缩放

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

使用介绍

RDK 平台

# 配置tros.b环境
source /opt/tros/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的模型和配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动launch文件
ros2 launch hobot_cv hobot_cv_pyramid.launch.py

结果分析

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [pyramid_example-1]: process started with pid [3071]
[pyramid_example-1] [INFO] [1655951639.110992960] [example]: pyramid image , time cost: 299 ms
[pyramid_example-1]
[pyramid_example-1] [INFO] [1655951639.432398919] [example]: pyramid image , time cost: 19 ms
[pyramid_example-1]
[INFO] [pyramid_example-1]: process has finished cleanly [pid 3071]

根据 log 显示,测试程序完成了对本地 1920x1080 分辨率图片金字塔缩小的处理。接口调用两次,两次耗时分别如下。

图片处理第一次运行耗时第二次运行耗时
1920x1080 金字塔六层基础层输出299ms19ms

因为第一次运行,需要对 vps 硬件进行配置所以耗时较多,如果不再更改硬件配置属性,硬件直接进行处理,耗时就会显著降低。

本地原图 1920x1080、pyramid 缩放后图片如下:

原图经金字塔缩放后的多尺度输出效果

输出基础层六层,每一层 size 是上一层的 1/2

性能对比

输入图片 1920x1080,向上获取 5 层输出获取到 960x540、480x270、240x134、120x66、60x32 分辨率的图片。分别对比 opencv 和 hobotcv 效率,结果如下:

cpu 占用为单核百分比,耗时统计单位为 ms

VPS 接口耗时vps 接口 cpu 占比opencv 耗时opencv 接口 cpu 占比
19ms42.556100

color

功能介绍

实现图像的 nv12,bgr24 之间的转换。

代码仓库:https://github.com/D-Robotics/hobot_cv

支持平台

平台运行方式示例功能
RDK X5, RDK X5 Module, RDK S100Ubuntu 22.04 (Humble)nv12,bgr24 之间的转换
RDK S600Ubuntu 24.04 (Jazzy)nv12,bgr24 之间的转换

准备工作

RDK 平台

  1. RDK 已烧录好 Ubuntu 系统镜像。

  2. RDK 已成功安装 TogetheROS.Bot。

使用介绍

RDK 平台

# 配置tros.b环境
source /opt/tros/humble/setup.bash
# 配置tros.b环境
source /opt/tros/humble/setup.bash
# 配置tros.b环境
source /opt/tros/jazzy/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的模型和配置文件。
cp -r /opt/tros/${TROS_DISTRO}/lib/hobot_cv/config/ .

# 启动launch文件
ros2 launch hobot_cv hobot_cv_conversion.launch.py

结果分析

[INFO] [launch]: All log files can be found below /root/.ros/log/2025-03-25-14-50-55-535138-ubuntu-4139
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [test_conersion-1]: process started with pid [4140]
[test_conersion-1] [INFO] [1742885455.683144151] [hobot_cv]: bgr24_to_nv12 opencv time cost: 4 ms
[test_conersion-1] [INFO] [1742885455.685469463] [hobot_cv]: nv12_to_bgr24 neon 1 time cost: 2 ms
[test_conersion-1] [INFO] [1742885455.836798125] [hobot_cv]: nv12_to_bgr24 neon 2 time cost: 2 ms
[test_conersion-1] [INFO] [1742885455.992973665] [hobot_cv]: bgr24_to_nv12 neon 1 time cost: 1 ms
[test_conersion-1] [INFO] [1742885455.997803043] [hobot_cv]: nv12_to_bgr24 opencv time cost: 4 ms
[test_conersion-1] [INFO] [1742885456.156813423] [hobot_cv]: bgr24_to_nv12 neon 2 time cost: 1 ms
[test_conersion-1] [INFO] [1742885456.161413872] [hobot_cv]: nv12_to_bgr24 opencv time cost: 4 ms
[INFO] [test_conersion-1]: process has finished cleanly [pid 4140]