Skip to main content

如何衡量 FastCV HAL 与 OpenCV 的性能对比

使用以下任一选项编译构建
  • 要启用 FastCV 加速,使用 -DWITH_FASTCV=ON 选项
  • 要在 CPU 上使用默认 OpenCV,使用 -DWITH_FASTCV=OFF 选项
注意默认情况下已启用基于 FastCV 的 OpenCV 加速。
编译完成后,烧录构建并启动设备。所有库都位于 /usr/lib/ 目录中。
  1. 将测试二进制文件复制到 /usr/bin 以运行测试。
  2. 如果之前未复制过测试数据,请将其复制到设备上。 要获取测试数据,请克隆 https://github.com/opencv/opencv_extra/tree/4.13.0 上的项目。 使用 scp 命令将测试数据推送到主机上的目标位置。例如:
  3. 要在目标设备上开始测试,请运行以下命令。
上述命令针对 subtract API 运行不同的测试用例,每个测试用例循环执行 100 次。 结果收集在 results_Arithm.txt 文本文件中。 results_Arithm.txt 包含各测试用例的详细信息,包括测试名称、样本数、分辨率、平均时间、通过/失败状态。对于以下启用了 FastCV 加速的测试用例,总耗时为 16 毫秒 FastCV 性能结果 使用默认 OpenCV 时,同一测试用例的总耗时为 23 毫秒。 OpenCV 性能结果 运行其他测试用例,并比较默认 OpenCV 与 FastCV 加速的 OpenCV 之间的延迟数据。

支持的 OpenCV API 及对应的 FastCV API

支持的 OpenCV API
OpenCV 模块OpenCV API用于 OpenCV 加速的底层 FastCV API
IMGPROCmedianBlurfcvFilterMedian3x3u8_v3
sobelfcvFilterSobel3x3u8s16
sobelfcvFilterSobel5x5u8s16
sobelfcvFilterSobel7x7u8s16
boxFilterfcvBoxFilter3x3u8_v3
boxFilterfcvBoxFilter5x5u8_v2
adaptiveThresholdfcvAdaptiveThresholdGaussian3x3u8_v2
adaptiveThresholdfcvAdaptiveThresholdGaussian5x5u8_v2
adaptiveThresholdfcvAdaptiveThresholdMean3x3u8_v2
adaptiveThresholdfcvAdaptiveThresholdMean5x5u8_v2
subtractfcvImageDiffu8f32_v2
pyrDownfcvPyramidCreateu8_v4
cvtColorfcvColorRGB888toYCrCbu8_v3
cvtColorfcvColorRGB888ToHSV888u8
GaussianBlurfcvFilterGaussian5x5u8_v3
GaussianBlurfcvFilterGaussian3x3u8_v4
cvWarpPerspectivefcvWarpPerspectiveu8_v5
CannyfcvFilterCannyu8
boxFilterfcvBoxFilterNxNf32
CORElutfcvTableLookupu8
normfcvHammingDistanceu8
multiplyfcvElementMultiplyu8u16_v2
multiplyfcvElementMultiplyu8
multiplyfcvElementMultiplys16
multiplyfcvElementMultiplyf32
transposefcvTransposeu8_v2
transposefcvTransposeu16_v2
transposefcvTransposef32_v2
meanStdDevfcvImageIntensityStats_v2
flipfcvFlipu8
flipfcvFlipu16
flipfcvFlipRGB888u8
rotatefcvRotateImageu8
rotatefcvRotateImageInterleavedu8
addWeightedfcvAddWeightedu8_v2
SVDfcvSVDf32_v2
GemmfcvMatrixMultiplyf32_v2
GemmfcvMultiplyScalarf32
GemmfcvAddf32_v2
FastCV CPU 扩展
OpenCV 扩展 API使用的 FastCV API描述
arithmetic_opfcvAddu8将两个 uint8_t 类型矩阵相加得到一个 uint8_t 矩阵
fcvAddf32_v2两个 float32_t 类型矩阵的矩阵加法。
fcvAdds16_v2两个 int16_t 类型矩阵的矩阵加法,支持原地操作
fcvSubtracts16两个 uint16_t 类型矩阵的矩阵减法
fcvSubtractu8两个 uint8_t 类型矩阵的矩阵减法
bilateralFilterfcvBilateralFilter5x5u8_v3使用 5x5 双边核进行双边平滑
fcvBilateralFilter7x7u8_v3使用 7x7 双边核进行双边平滑
fcvBilateralFilter9x9u8_v3使用 9x9 双边核进行双边平滑
bilateralRecursivefcvBilateralFilterRecursiveu8此处的平滑实际是在梯度域中执行的。
buildPyramidfcvPyramidAllocate_v3为图像金字塔分配内存。此 API 可能在不另行通知的情况下被移除,仅应用于测试。
fcvPyramidCreateu8_v4从 8 位无符号(灰度)源图像创建图像金字塔。
fcvPyramidDelete_v2释放 fcvPyramidLevel 数组。可用于任何类型(f32/s8/u8)。
calcHistfcvImageIntensityHistogram为灰度图像的矩形区域创建强度直方图。
clusterEuclideanfcvClusterEuclideanu8用于计算聚类中心和聚类绑定的通用函数
cvtColorfcvColorYCbCr420PseudoPlanarToYCbCr444PseudoPlanaru8从伪平面 YCbCr420 到伪平面 YCbCr444 的颜色转换。
fcvColorYCbCr420PseudoPlanarToYCbCr422PseudoPlanaru8从伪平面 YCbCr420 到伪平面 YCbCr422 的颜色转换。
fcvColorYCbCr422PseudoPlanarToYCbCr444PseudoPlanaru8从伪平面 YCbCr422 到伪平面 YCbCr444 的颜色转换。
fcvColorYCbCr422PseudoPlanarToYCbCr420PseudoPlanaru8从伪平面 YCbCr422 到伪平面 YCbCr420 的颜色转换。
fcvColorYCbCr444PseudoPlanarToYCbCr422PseudoPlanaru8从伪平面 YCbCr444 到伪平面 YCbCr422 的颜色转换。
fcvColorYCbCr444PseudoPlanarToYCbCr420PseudoPlanaru8从伪平面 YCbCr444 到伪平面 YCbCr420 的颜色转换。
fcvColorRGB565ToYCbCr444PseudoPlanaru8从 RGB565 到伪平面 YCbCr444 的颜色转换。
fcvColorRGB565ToYCbCr422PseudoPlanaru8从 RGB565 到伪平面 YCbCr422 的颜色转换。
fcvColorRGB565ToYCbCr420PseudoPlanaru8从 RGB565 到伪平面 YCbCr420 的颜色转换。
fcvColorRGB888ToYCbCr444PseudoPlanaru8从 RGB888 到伪平面 YCbCr444 的颜色转换。
fcvColorRGB888ToYCbCr422PseudoPlanaru8从 RGB888 到伪平面 YCbCr422 的颜色转换。
fcvColorRGB888ToYCbCr420PseudoPlanaru8从 RGB888 到伪平面 YCbCr420 的颜色转换。
fcvColorYCbCr420PseudoPlanarToRGB565u8从伪平面 YCbCr420 到 RGB565 的颜色转换。
fcvColorYCbCr422PseudoPlanarToRGB565u8从伪平面 YCbCr422 到 RGB565 的颜色转换。
fcvColorYCbCr422PseudoPlanarToRGB888u8从伪平面 YCbCr422 到 RGB888 的颜色转换。
fcvColorYCbCr422PseudoPlanarToRGBA8888u8从伪平面 YCbCr422 到 RGBA8888 的颜色转换。
fcvColorYCbCr444PseudoPlanarToRGB565u8从伪平面 YCbCr444 到 RGB565 的颜色转换。
fcvColorYCbCr444PseudoPlanarToRGB888u8从伪平面 YCbCr444 到 RGB888 的颜色转换。
DCTfcvDCTu8对 uint8_t 像素执行正向离散余弦变换
FAST10fcvCornerFast10InMaskScoreu8基于掩码从图像中提取 FAST 角点和评分。
fcvCornerFast10InMasku8从图像中提取 FAST 角点。
fcvCornerFast10Scoreu8从图像中提取 FAST 角点和评分
fcvCornerFast10u8从图像中提取 FAST 角点。
FFTfcvFFTu8计算实值矩阵的一维或二维快速傅里叶变换。
fillConvexPolyfcvFillConvexPolyu8此函数使用指定的颜色填充凸多边形的内部。
filter2DfcvFilterCorrNxNu8使用不可分离核的 NxN 相关运算。此函数忽略边界值。
fcvFilterCorrNxNu8s16使用不可分离核的 NxN 相关运算。此函数忽略边界值。
fcvFilterCorrNxNu8f32使用不可分离核的 NxN 相关运算。此函数忽略边界值。
gaussianBlurfcvFilterGaussian3x3u8_v4使用 3x3 高斯滤波器对图像进行模糊,边界处理方式由用户指定
fcvFilterGaussian5x5u8_v3使用 5x5 高斯滤波器对图像进行模糊
fcvFilterGaussian5x5s16_v3使用 5x5 高斯滤波器对图像进行模糊
fcvFilterGaussian5x5s32_v3使用 5x5 高斯滤波器对图像进行模糊
fcvFilterGaussian11x11u8_v2使用 11x11 高斯滤波器对图像进行模糊
houghLinesfcvHoughLineu8执行霍夫直线检测
iDCTfcvIDCTs16对 int16_t 系数执行逆离散余弦变换
IFFTfcvIFFTf32计算复值矩阵的一维或二维快速傅里叶逆变换。
integrateImageYUVfcvIntegrateImageYCbCr420PseudoPlanaru8此函数计算 YCbCr420 图像的积分图,其中输入 YCbCr420 的 UV 是交错排列的。
matmuls8s32fcvMatrixMultiplys8s32两个 int8_t 类型矩阵的矩阵乘法
meanShiftfcvMeanShiftu8应用 meanshift 过程并获得最终收敛位置。源图像必须是 8 位灰度图像。
fcvMeanShifts32应用 meanshift 过程并获得最终收敛位置。源图像必须是 32 位整型灰度图像。
fcvMeanShiftf32应用 meanshift 过程并获得最终收敛位置。源图像必须是 32 位浮点灰度图像。
MergefcvChannelCombine2Planesu8以交错方式合并两个通道
fcvChannelCombine3Planesu8以交错方式合并三个通道
fcvChannelCombine4Planesu8以交错方式合并四个通道
momentsfcvImageMomentsu8计算图像像素强度的加权平均(矩)。输入必须为 8 位图像数据。
fcvImageMomentss32计算图像像素强度的加权平均(矩)。输入必须为 int32_t 数据类型。
fcvImageMomentsf32计算图像像素强度的加权平均(矩)。输入必须为 float32_t 数据类型。
NormalizeLocalBoxfcvNormalizeLocalBoxu8计算图像的局部减法和对比度归一化。
fcvNormalizeLocalBoxf32计算图像的局部减法和对比度归一化。
remapfcvRemapu8_v2对灰度 CV_8UC1 图像应用通用几何变换。
remapRGBAfcvRemapRGBA8888BLu8使用双线性插值对 4 通道 CV_8UC4 图像应用通用几何变换
fcvRemapRGBA8888NNu8使用最近邻插值对 4 通道 CV_8UC4 图像应用通用几何变换
resizeDownBy2fcvScaleDownBy2u8_v2通过对每个 2x2 像素块求平均对图像进行降采样
resizeDownBy4fcvScaleDownBy4u8_v2通过对每个 4x4 像素块求平均对图像进行降采样
ResizeDownFcvScaleDownMNu8使用 MN 方法进行图像降采样
fcvScaleDownMNInterleaveu8使用 MN 方法对交错图像进行降采样
runMSERfcvMserInit初始化 MSER 的函数。
fcvMserNN8Init初始化 8 邻域 MSER 的函数
fcvMserExtu8_v3以更小内存占用调用 MSER 的函数,可(可选地)输出轮廓边界框及附加信息。
fcvMserExtNN8u8调用 8 邻域 MSER 的函数,并为每个轮廓提供附加输出。
fcvMserNN8u8调用 8 邻域 MSER 的函数。
fcvMserRelease释放 MSER 资源的函数。
sepFilter2DfcvFilterCorrSepMxNu8使用可分离核的 MxN 相关运算。
fcvFilterCorrSep9x9s16_v2使用可分离核的 9x9 FIR 滤波器(卷积)。
fcvFilterCorrSep11x11s16_v2使用可分离核的 11x11 FIR 滤波器(卷积)。
fcvFilterCorrSep13x13s16_v2使用可分离核的 13x13 相关运算。
fcvFilterCorrSep15x15s16_v2使用可分离核的 15x15 相关运算。
fcvFilterCorrSep17x17s16_v2使用可分离核的 17x17 相关运算。
fcvFilterCorrSepNxNs16使用可分离核的 NxN 相关运算。
sobelfcvFilterSobel3x3u8_v23x3 Sobel 边缘滤波器
fcvFilterSobel3x3u8s16从源亮度数据创建未归一化的 2D 梯度图像。使用 3x3 Sobel 核进行卷积。
fcvFilterSobel5x5u8s16从源亮度数据创建未归一化的 2D 梯度图像。使用 5x5 Sobel 核进行卷积。
fcvFilterSobel7x7u8s16从源亮度数据创建未归一化的 2D 梯度图像。使用 7x7 Sobel 核进行卷积。
sobelPyramidfcvPyramidAllocate为金字塔分配内存
fcvPyramidAllocate_v2为金字塔分配内存
fcvPyramidAllocate_v3为金字塔分配内存
fcvPyramidSobelGradientCreatei8从 uint8_t 图像金字塔创建 integer8 梯度金字塔
fcvPyramidSobelGradientCreatei16从 uint8_t 图像金字塔创建 int16_t 梯度金字塔
fcvPyramidSobelGradientCreatef32从 uint8_t 图像金字塔创建 float32 梯度金字塔
fcvPyramidDelete释放 fcvPyramidLevel 数组。可用于任何类型(f32/s8/u8)。
fcvPyramidDelete_v2释放 fcvPyramidLevel 数组。可用于任何类型(f32/s8/u8)。
fcvPyramidCreatef32_v2构建图像金字塔(带步幅)。内存应使用 fcvPyramidDelete_v2 释放
fcvPyramidCreateu8_v4构建高斯图像金字塔。
sobel3x3u8fcvImageGradientSobelPlanars8_v2使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像
sobel3x3u9fcvImageGradientSobelPlanars16_v2使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像
sobel3x3u10fcvImageGradientSobelPlanars16_v3使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像
sobel3x3u11fcvImageGradientSobelPlanarf32_v2使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像
sobel3x3u12fcvImageGradientSobelPlanarf32_v3使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像
splitfcvDeinterleaveu8对无符号字节数据执行图像去交错。
fcvChannelExtractu8从交错或多平面图像格式中将通道提取为单个 uint8_t 类型平面
thresholdRangefcvFilterThresholdRangeu8_v2基于一对阈值对灰度图像进行二值化。
trackOpticalFlowLKfcvTrackLKOpticalFlowu8_v3光流(带步幅,因此可支持 ROI)
fcvTrackLKOpticalFlowu8光流。位宽优化实现
warpAffinefcvTransformAffineClippedu8_v3使用 2x3 矩阵对灰度图像应用仿射变换。
warpAffine3Planefcv3ChannelTransformAffineClippedBCu8使用 2x3 矩阵和双三次插值对 3 色通道图像应用仿射变换。
warpPatchAffinefcvTransformAffineu8_v2使用 nAffine 中的仿射变换对输入图像中以 nPos 为中心的图像块进行变形
warpPerspectivefcvWarpPerspectiveu8_v5使用透视投影变换矩阵(也称为单应矩阵)对灰度图像进行变形。
warpPerspective2Planefcv2PlaneWarpPerspectiveu8使用同一变换对两幅图像进行透视变形。
FastCV QDSP 扩展
OpenCV 扩展 API使用的 FastCV API描述
CannyfcvFilterCannyu8Q提供更多算法配置控制的 Canny 边缘检测。
fcvdspinitfcvQ6Init初始化 FastCV DSP 环境。
fcvdspdeinitfcvQ6DeInit反初始化 FastCV DSP 环境。
FFTfcvFFTu8Q计算实值矩阵的一维或二维快速傅里叶变换。
filter2DfcvFilterCorr3x3s8_v2Q使用不可分离核的 3x3 相关运算。
fcvFilterCorrNxNu8Q使用不可分离核的 NxN 相关运算。此函数忽略边界值。
fcvFilterCorrNxNu8s16Q使用不可分离核的 NxN 相关运算。此函数忽略边界值。
fcvFilterCorrNxNu8f32Q使用不可分离核的 NxN 相关运算。此函数忽略边界值。
IFFTfcvIFFTf32Q计算复值矩阵的一维或二维快速傅里叶逆变换。
sumOfAbsoluteDiffsfcvSumOfAbsoluteDiffs8x8u8_v2Q图像相对于 8x8 模板的绝对差之和。
thresholdOtsufcvFilterThresholdOtsuu8Q使用 Otsu 方法对灰度图像进行二值化。
有关 FastCV 扩展的详细信息,请参阅该扩展的文档

启用或禁用 FastCV 加速

启用 如下所示,在 OpenCV BitBake 文件的 EXTRA_OECMAKE 选项中包含 -DWITH_FASTCV=ON 来启用 FastCV HAL 加速。 该标志允许使用 FastCV HAL 编译 OpenCV API。
禁用 如下所示,在 OpenCV BitBake 文件的 EXTRA_OECMAKE 选项中包含 -DWITH_FASTCV=OFF 来禁用 FastCV HAL 加速,然后使用 devtool 方法重新编译 OpenCV 配方。
以下展示了该标志如何包含在 CMakeLists 文件中(opencv/3rdparty/fastcv/CMakeLists.txt):
以下示例是使用 FastCV API 实现的 FastCV HAL API 之一。 opencv/3rdparty/fastcv/src/fastcv_hal_core.cpp