如何衡量 FastCV HAL 与 OpenCV 的性能对比
使用以下任一选项编译构建- 要启用 FastCV 加速,使用
-DWITH_FASTCV=ON选项 - 要在 CPU 上使用默认 OpenCV,使用
-DWITH_FASTCV=OFF选项
注意默认情况下已启用基于 FastCV 的 OpenCV 加速。
/usr/lib/ 目录中。
-
将测试二进制文件复制到
/usr/bin以运行测试。 -
如果之前未复制过测试数据,请将其复制到设备上。
要获取测试数据,请克隆 https://github.com/opencv/opencv_extra/tree/4.13.0 上的项目。
使用
scp命令将测试数据推送到主机上的目标位置。例如: -
要在目标设备上开始测试,请运行以下命令。
results_Arithm.txt 文本文件中。
results_Arithm.txt 包含各测试用例的详细信息,包括测试名称、样本数、分辨率、平均时间、通过/失败状态。对于以下启用了 FastCV 加速的测试用例,总耗时为 16 毫秒。
使用默认 OpenCV 时,同一测试用例的总耗时为 23 毫秒。
运行其他测试用例,并比较默认 OpenCV 与 FastCV 加速的 OpenCV 之间的延迟数据。
支持的 OpenCV API 及对应的 FastCV API
支持的 OpenCV API
| OpenCV 模块 | OpenCV API | 用于 OpenCV 加速的底层 FastCV API |
|---|---|---|
| IMGPROC | medianBlur | fcvFilterMedian3x3u8_v3 |
| sobel | fcvFilterSobel3x3u8s16 | |
| sobel | fcvFilterSobel5x5u8s16 | |
| sobel | fcvFilterSobel7x7u8s16 | |
| boxFilter | fcvBoxFilter3x3u8_v3 | |
| boxFilter | fcvBoxFilter5x5u8_v2 | |
| adaptiveThreshold | fcvAdaptiveThresholdGaussian3x3u8_v2 | |
| adaptiveThreshold | fcvAdaptiveThresholdGaussian5x5u8_v2 | |
| adaptiveThreshold | fcvAdaptiveThresholdMean3x3u8_v2 | |
| adaptiveThreshold | fcvAdaptiveThresholdMean5x5u8_v2 | |
| subtract | fcvImageDiffu8f32_v2 | |
| pyrDown | fcvPyramidCreateu8_v4 | |
| cvtColor | fcvColorRGB888toYCrCbu8_v3 | |
| cvtColor | fcvColorRGB888ToHSV888u8 | |
| GaussianBlur | fcvFilterGaussian5x5u8_v3 | |
| GaussianBlur | fcvFilterGaussian3x3u8_v4 | |
| cvWarpPerspective | fcvWarpPerspectiveu8_v5 | |
| Canny | fcvFilterCannyu8 | |
| boxFilter | fcvBoxFilterNxNf32 | |
| CORE | lut | fcvTableLookupu8 |
| norm | fcvHammingDistanceu8 | |
| multiply | fcvElementMultiplyu8u16_v2 | |
| multiply | fcvElementMultiplyu8 | |
| multiply | fcvElementMultiplys16 | |
| multiply | fcvElementMultiplyf32 | |
| transpose | fcvTransposeu8_v2 | |
| transpose | fcvTransposeu16_v2 | |
| transpose | fcvTransposef32_v2 | |
| meanStdDev | fcvImageIntensityStats_v2 | |
| flip | fcvFlipu8 | |
| flip | fcvFlipu16 | |
| flip | fcvFlipRGB888u8 | |
| rotate | fcvRotateImageu8 | |
| rotate | fcvRotateImageInterleavedu8 | |
| addWeighted | fcvAddWeightedu8_v2 | |
| SVD | fcvSVDf32_v2 | |
| Gemm | fcvMatrixMultiplyf32_v2 | |
| Gemm | fcvMultiplyScalarf32 | |
| Gemm | fcvAddf32_v2 |
FastCV CPU 扩展
| OpenCV 扩展 API | 使用的 FastCV API | 描述 |
|---|---|---|
| arithmetic_op | fcvAddu8 | 将两个 uint8_t 类型矩阵相加得到一个 uint8_t 矩阵 |
| fcvAddf32_v2 | 两个 float32_t 类型矩阵的矩阵加法。 | |
| fcvAdds16_v2 | 两个 int16_t 类型矩阵的矩阵加法,支持原地操作 | |
| fcvSubtracts16 | 两个 uint16_t 类型矩阵的矩阵减法 | |
| fcvSubtractu8 | 两个 uint8_t 类型矩阵的矩阵减法 | |
| bilateralFilter | fcvBilateralFilter5x5u8_v3 | 使用 5x5 双边核进行双边平滑 |
| fcvBilateralFilter7x7u8_v3 | 使用 7x7 双边核进行双边平滑 | |
| fcvBilateralFilter9x9u8_v3 | 使用 9x9 双边核进行双边平滑 | |
| bilateralRecursive | fcvBilateralFilterRecursiveu8 | 此处的平滑实际是在梯度域中执行的。 |
| buildPyramid | fcvPyramidAllocate_v3 | 为图像金字塔分配内存。此 API 可能在不另行通知的情况下被移除,仅应用于测试。 |
| fcvPyramidCreateu8_v4 | 从 8 位无符号(灰度)源图像创建图像金字塔。 | |
| fcvPyramidDelete_v2 | 释放 fcvPyramidLevel 数组。可用于任何类型(f32/s8/u8)。 | |
| calcHist | fcvImageIntensityHistogram | 为灰度图像的矩形区域创建强度直方图。 |
| clusterEuclidean | fcvClusterEuclideanu8 | 用于计算聚类中心和聚类绑定的通用函数 |
| cvtColor | fcvColorYCbCr420PseudoPlanarToYCbCr444PseudoPlanaru8 | 从伪平面 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 的颜色转换。 | |
| DCT | fcvDCTu8 | 对 uint8_t 像素执行正向离散余弦变换 |
| FAST10 | fcvCornerFast10InMaskScoreu8 | 基于掩码从图像中提取 FAST 角点和评分。 |
| fcvCornerFast10InMasku8 | 从图像中提取 FAST 角点。 | |
| fcvCornerFast10Scoreu8 | 从图像中提取 FAST 角点和评分 | |
| fcvCornerFast10u8 | 从图像中提取 FAST 角点。 | |
| FFT | fcvFFTu8 | 计算实值矩阵的一维或二维快速傅里叶变换。 |
| fillConvexPoly | fcvFillConvexPolyu8 | 此函数使用指定的颜色填充凸多边形的内部。 |
| filter2D | fcvFilterCorrNxNu8 | 使用不可分离核的 NxN 相关运算。此函数忽略边界值。 |
| fcvFilterCorrNxNu8s16 | 使用不可分离核的 NxN 相关运算。此函数忽略边界值。 | |
| fcvFilterCorrNxNu8f32 | 使用不可分离核的 NxN 相关运算。此函数忽略边界值。 | |
| gaussianBlur | fcvFilterGaussian3x3u8_v4 | 使用 3x3 高斯滤波器对图像进行模糊,边界处理方式由用户指定 |
| fcvFilterGaussian5x5u8_v3 | 使用 5x5 高斯滤波器对图像进行模糊 | |
| fcvFilterGaussian5x5s16_v3 | 使用 5x5 高斯滤波器对图像进行模糊 | |
| fcvFilterGaussian5x5s32_v3 | 使用 5x5 高斯滤波器对图像进行模糊 | |
| fcvFilterGaussian11x11u8_v2 | 使用 11x11 高斯滤波器对图像进行模糊 | |
| houghLines | fcvHoughLineu8 | 执行霍夫直线检测 |
| iDCT | fcvIDCTs16 | 对 int16_t 系数执行逆离散余弦变换 |
| IFFT | fcvIFFTf32 | 计算复值矩阵的一维或二维快速傅里叶逆变换。 |
| integrateImageYUV | fcvIntegrateImageYCbCr420PseudoPlanaru8 | 此函数计算 YCbCr420 图像的积分图,其中输入 YCbCr420 的 UV 是交错排列的。 |
| matmuls8s32 | fcvMatrixMultiplys8s32 | 两个 int8_t 类型矩阵的矩阵乘法 |
| meanShift | fcvMeanShiftu8 | 应用 meanshift 过程并获得最终收敛位置。源图像必须是 8 位灰度图像。 |
| fcvMeanShifts32 | 应用 meanshift 过程并获得最终收敛位置。源图像必须是 32 位整型灰度图像。 | |
| fcvMeanShiftf32 | 应用 meanshift 过程并获得最终收敛位置。源图像必须是 32 位浮点灰度图像。 | |
| Merge | fcvChannelCombine2Planesu8 | 以交错方式合并两个通道 |
| fcvChannelCombine3Planesu8 | 以交错方式合并三个通道 | |
| fcvChannelCombine4Planesu8 | 以交错方式合并四个通道 | |
| moments | fcvImageMomentsu8 | 计算图像像素强度的加权平均(矩)。输入必须为 8 位图像数据。 |
| fcvImageMomentss32 | 计算图像像素强度的加权平均(矩)。输入必须为 int32_t 数据类型。 | |
| fcvImageMomentsf32 | 计算图像像素强度的加权平均(矩)。输入必须为 float32_t 数据类型。 | |
| NormalizeLocalBox | fcvNormalizeLocalBoxu8 | 计算图像的局部减法和对比度归一化。 |
| fcvNormalizeLocalBoxf32 | 计算图像的局部减法和对比度归一化。 | |
| remap | fcvRemapu8_v2 | 对灰度 CV_8UC1 图像应用通用几何变换。 |
| remapRGBA | fcvRemapRGBA8888BLu8 | 使用双线性插值对 4 通道 CV_8UC4 图像应用通用几何变换 |
| fcvRemapRGBA8888NNu8 | 使用最近邻插值对 4 通道 CV_8UC4 图像应用通用几何变换 | |
| resizeDownBy2 | fcvScaleDownBy2u8_v2 | 通过对每个 2x2 像素块求平均对图像进行降采样 |
| resizeDownBy4 | fcvScaleDownBy4u8_v2 | 通过对每个 4x4 像素块求平均对图像进行降采样 |
| ResizeDown | FcvScaleDownMNu8 | 使用 MN 方法进行图像降采样 |
| fcvScaleDownMNInterleaveu8 | 使用 MN 方法对交错图像进行降采样 | |
| runMSER | fcvMserInit | 初始化 MSER 的函数。 |
| fcvMserNN8Init | 初始化 8 邻域 MSER 的函数 | |
| fcvMserExtu8_v3 | 以更小内存占用调用 MSER 的函数,可(可选地)输出轮廓边界框及附加信息。 | |
| fcvMserExtNN8u8 | 调用 8 邻域 MSER 的函数,并为每个轮廓提供附加输出。 | |
| fcvMserNN8u8 | 调用 8 邻域 MSER 的函数。 | |
| fcvMserRelease | 释放 MSER 资源的函数。 | |
| sepFilter2D | fcvFilterCorrSepMxNu8 | 使用可分离核的 MxN 相关运算。 |
| fcvFilterCorrSep9x9s16_v2 | 使用可分离核的 9x9 FIR 滤波器(卷积)。 | |
| fcvFilterCorrSep11x11s16_v2 | 使用可分离核的 11x11 FIR 滤波器(卷积)。 | |
| fcvFilterCorrSep13x13s16_v2 | 使用可分离核的 13x13 相关运算。 | |
| fcvFilterCorrSep15x15s16_v2 | 使用可分离核的 15x15 相关运算。 | |
| fcvFilterCorrSep17x17s16_v2 | 使用可分离核的 17x17 相关运算。 | |
| fcvFilterCorrSepNxNs16 | 使用可分离核的 NxN 相关运算。 | |
| sobel | fcvFilterSobel3x3u8_v2 | 3x3 Sobel 边缘滤波器 |
| fcvFilterSobel3x3u8s16 | 从源亮度数据创建未归一化的 2D 梯度图像。使用 3x3 Sobel 核进行卷积。 | |
| fcvFilterSobel5x5u8s16 | 从源亮度数据创建未归一化的 2D 梯度图像。使用 5x5 Sobel 核进行卷积。 | |
| fcvFilterSobel7x7u8s16 | 从源亮度数据创建未归一化的 2D 梯度图像。使用 7x7 Sobel 核进行卷积。 | |
| sobelPyramid | fcvPyramidAllocate | 为金字塔分配内存 |
| 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 | 构建高斯图像金字塔。 | |
| sobel3x3u8 | fcvImageGradientSobelPlanars8_v2 | 使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像 |
| sobel3x3u9 | fcvImageGradientSobelPlanars16_v2 | 使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像 |
| sobel3x3u10 | fcvImageGradientSobelPlanars16_v3 | 使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像 |
| sobel3x3u11 | fcvImageGradientSobelPlanarf32_v2 | 使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像 |
| sobel3x3u12 | fcvImageGradientSobelPlanarf32_v3 | 使用 3x3 邻域和 Sobel 核从源亮度数据创建 2D 梯度图像 |
| split | fcvDeinterleaveu8 | 对无符号字节数据执行图像去交错。 |
| fcvChannelExtractu8 | 从交错或多平面图像格式中将通道提取为单个 uint8_t 类型平面 | |
| thresholdRange | fcvFilterThresholdRangeu8_v2 | 基于一对阈值对灰度图像进行二值化。 |
| trackOpticalFlowLK | fcvTrackLKOpticalFlowu8_v3 | 光流(带步幅,因此可支持 ROI) |
| fcvTrackLKOpticalFlowu8 | 光流。位宽优化实现 | |
| warpAffine | fcvTransformAffineClippedu8_v3 | 使用 2x3 矩阵对灰度图像应用仿射变换。 |
| warpAffine3Plane | fcv3ChannelTransformAffineClippedBCu8 | 使用 2x3 矩阵和双三次插值对 3 色通道图像应用仿射变换。 |
| warpPatchAffine | fcvTransformAffineu8_v2 | 使用 nAffine 中的仿射变换对输入图像中以 nPos 为中心的图像块进行变形 |
| warpPerspective | fcvWarpPerspectiveu8_v5 | 使用透视投影变换矩阵(也称为单应矩阵)对灰度图像进行变形。 |
| warpPerspective2Plane | fcv2PlaneWarpPerspectiveu8 | 使用同一变换对两幅图像进行透视变形。 |
FastCV QDSP 扩展
| OpenCV 扩展 API | 使用的 FastCV API | 描述 |
|---|---|---|
| Canny | fcvFilterCannyu8Q | 提供更多算法配置控制的 Canny 边缘检测。 |
| fcvdspinit | fcvQ6Init | 初始化 FastCV DSP 环境。 |
| fcvdspdeinit | fcvQ6DeInit | 反初始化 FastCV DSP 环境。 |
| FFT | fcvFFTu8Q | 计算实值矩阵的一维或二维快速傅里叶变换。 |
| filter2D | fcvFilterCorr3x3s8_v2Q | 使用不可分离核的 3x3 相关运算。 |
| fcvFilterCorrNxNu8Q | 使用不可分离核的 NxN 相关运算。此函数忽略边界值。 | |
| fcvFilterCorrNxNu8s16Q | 使用不可分离核的 NxN 相关运算。此函数忽略边界值。 | |
| fcvFilterCorrNxNu8f32Q | 使用不可分离核的 NxN 相关运算。此函数忽略边界值。 | |
| IFFT | fcvIFFTf32Q | 计算复值矩阵的一维或二维快速傅里叶逆变换。 |
| sumOfAbsoluteDiffs | fcvSumOfAbsoluteDiffs8x8u8_v2Q | 图像相对于 8x8 模板的绝对差之和。 |
| thresholdOtsu | fcvFilterThresholdOtsuu8Q | 使用 Otsu 方法对灰度图像进行二值化。 |
启用或禁用 FastCV 加速
启用 如下所示,在 OpenCV BitBake 文件的 EXTRA_OECMAKE 选项中包含 -DWITH_FASTCV=ON 来启用 FastCV HAL 加速。 该标志允许使用 FastCV HAL 编译 OpenCV API。EXTRA_OECMAKE 选项中包含 -DWITH_FASTCV=OFF 来禁用 FastCV HAL 加速,然后使用 devtool 方法重新编译 OpenCV 配方。
opencv/3rdparty/fastcv/CMakeLists.txt):
opencv/3rdparty/fastcv/src/fastcv_hal_core.cpp

