Skip to main content

如何衡量 FastCV HAL 与 OpenCV 的性能

使用以下任一选项编译构建
  • 要启用 FastCV 加速,请使用 -DWITH_FASTCV=ON 选项
  • 要在 CPU 上启用默认 OpenCV,请使用 -DWITH_FASTCV=OFF 选项
注意默认情况下,使用 FastCV 的 OpenCV 加速处于启用状态。
编译完成后,烧录构建并启动设备。所有库都位于 /usr/lib/ 目录中。
  1. 将测试二进制文件复制到 /usr/bin 以运行测试。
  2. 如果之前未复制测试数据,请将其复制到设备。 要获取测试数据,请克隆 opencv_extra 仓库。 使用 scp 命令将测试数据推送到主机上的目标位置。例如:
  3. 要在目标设备上启动测试,请运行以下命令。
上述命令针对 subtract API 运行不同的测试用例,每个测试用例循环 100 次。 结果收集在 results_Arithm.txt 文本文件中。 results_Arithm.txt 包含不同测试用例的详细信息,包括测试名称、样本数、分辨率、平均时间、通过/失败状态。对于以下启用了 FastCV 加速的测试用例,总耗时为 16 ms。 FastCV 性能结果 使用默认 OpenCV 时,同一测试用例的总耗时为 23 ms。 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从 pseudo planar YCbCr420 到 pseudo planar YCbCr444 的颜色转换。
fcvColorYCbCr420PseudoPlanarToYCbCr422PseudoPlanaru8从 pseudo planar YCbCr420 到 pseudo planar YCbCr422 的颜色转换。
fcvColorYCbCr422PseudoPlanarToYCbCr444PseudoPlanaru8从 pseudo planar YCbCr422 到 pseudo planar YCbCr444 的颜色转换。
fcvColorYCbCr422PseudoPlanarToYCbCr420PseudoPlanaru8从 pseudo planar YCbCr422 到 pseudo planar YCbCr420 的颜色转换。
fcvColorYCbCr444PseudoPlanarToYCbCr422PseudoPlanaru8从 pseudo planar YCbCr444 到 pseudo planar YCbCr422 的颜色转换。
fcvColorYCbCr444PseudoPlanarToYCbCr420PseudoPlanaru8从 pseudo planar YCbCr444 到 pseudo planar YCbCr420 的颜色转换。
fcvColorRGB565ToYCbCr444PseudoPlanaru8从 RGB565 到 pseudo-planar YCbCr444 的颜色转换。
fcvColorRGB565ToYCbCr422PseudoPlanaru8从 RGB565 到 pseudo-planar YCbCr422 的颜色转换。
fcvColorRGB565ToYCbCr420PseudoPlanaru8从 RGB565 到 pseudo-planar YCbCr420 的颜色转换。
fcvColorRGB888ToYCbCr444PseudoPlanaru8从 RGB888 到 pseudo-planar YCbCr444 的颜色转换。
fcvColorRGB888ToYCbCr422PseudoPlanaru8从 RGB888 到 pseudo-planar YCbCr422 的颜色转换。
fcvColorRGB888ToYCbCr420PseudoPlanaru8从 RGB888 到 pseudo-planar YCbCr420 的颜色转换。
fcvColorYCbCr420PseudoPlanarToRGB565u8从 pseudo-planar YCbCr420 到 RGB565 的颜色转换。
fcvColorYCbCr422PseudoPlanarToRGB565u8从 pseudo-planar YCbCr422 到 RGB565 的颜色转换。
fcvColorYCbCr422PseudoPlanarToRGB888u8从 pseudo-planar YCbCr422 到 RGB888 的颜色转换。
fcvColorYCbCr422PseudoPlanarToRGBA8888u8从 pseudo-planar YCbCr422 到 RGBA8888 的颜色转换。
fcvColorYCbCr444PseudoPlanarToRGB565u8从 pseudo-planar YCbCr444 到 RGB565 的颜色转换。
fcvColorYCbCr444PseudoPlanarToRGB888u8从 pseudo-planar YCbCr444 到 RGB888 的颜色转换。
DCTfcvDCTu8对 uint8_t 像素执行正向离散余弦变换
FAST10fcvCornerFast10InMaskScoreu8根据掩码从图像中提取 FAST 角点和分数。
fcvCornerFast10InMasku8从图像中提取 FAST 角点。
fcvCornerFast10Scoreu8从图像中提取 FAST 角点和分数
fcvCornerFast10u8从图像中提取 FAST 角点。
FFTfcvFFTu8计算实值矩阵的 1D 或 2D 快速傅里叶变换。
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计算复值矩阵的 1D 或 2D 逆快速傅里叶变换。
integrateImageYUVfcvIntegrateImageYCbCr420PseudoPlanaru8此函数计算 YCbCr420 图像的积分图像,其中输入 YCbCr420 的 UV 为交错格式。
matmuls8s32fcvMatrixMultiplys8s32两个 int8_t 类型矩阵的矩阵乘法
meanShiftfcvMeanShiftu8应用 meanshift 过程并获得最终收敛位置。源图像必须是 8 位灰度图像。
fcvMeanShifts32应用 meanshift 过程并获得最终收敛位置。源图像必须是 int 32 位灰度图像。
fcvMeanShiftf32应用 meanshift 过程并获得最终收敛位置。源图像必须是 float 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计算实值矩阵的 1D 或 2D 快速傅里叶变换。
filter2DfcvFilterCorr3x3s8_v2Q使用不可分离核的 3x3 相关运算。
fcvFilterCorrNxNu8Q使用不可分离核的 NxN 相关运算。此函数忽略边界值。
fcvFilterCorrNxNu8s16Q使用不可分离核的 NxN 相关运算。此函数忽略边界值。
fcvFilterCorrNxNu8f32Q使用不可分离核的 NxN 相关运算。此函数忽略边界值。
IFFTfcvIFFTf32Q计算复值矩阵的 1D 或 2D 逆快速傅里叶变换。
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