OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
使用 FastCV 构建 OpenCV

兼容性OpenCV >= 4.11.0

为高通芯片组启用带有 FastCV 的 OpenCV

本文档旨在指导开发者在高通芯片组(采用 ARM64 架构)上启用 FastCV 加速 OpenCV。目前,在非高通芯片组或除 高通 Linux 之外的 Linux 平台上启用带有 FastCV 后端的 OpenCV 不在本文档范围内。

关于 FastCV

FastCV 为计算机视觉应用程序开发者提供两个主要功能:

  • 一个常用计算机视觉(CV)函数库,经过优化,可在各种高通骁龙设备上高效运行。
  • 一个清晰的、与处理器无关的硬件加速 API,芯片组供应商可以通过该 API 在高通骁龙硬件上对 FastCV 函数进行硬件加速。

FastCV 以统一二进制文件的形式发布,即一个包含算法两种实现的二进制文件:

  • 通用实现运行在 Arm® 架构上,被称为用于 Arm 架构的 FastCV。
  • 实现仅在高通® 骁龙™ 芯片组上运行,被称为用于骁龙的 FastCV。

与其他 CV 库相比,FastCV 库是高通专有的,可在各种硬件上提供更快的 CV 算法实现。

使用 FastCV HAL 和扩展加速 OpenCV

OpenCV 和 FastCV 的集成通过两种方式实现:

  1. 基于 FastCV 的 HAL,用于基本的计算机视觉和算术算法加速。
  2. opencv_contrib 中的 FastCV 模块,包含不适合通用 OpenCV 接口或行为的自定义算法和 FastCV 函数包装器。

支持的平台

  1. Android:高通芯片组,搭载骁龙 8 Gen 1 及更高版本的 Android(https://www.qualcomm.com/products/mobile/snapdragon/smartphones#product-list
  2. Linux:硬件 中提到的与高通 Linux 计划相关的开发板

为 Android 编译带有 FastCV 的 OpenCV

  1. 请按照 OpenCV 编译的 Wiki 页面进行操作https://github.com/opencv/opencv/wiki/Custom-OpenCV-Android-SDK-and-AAR-package-build

    将 OpenCV 存储库代码克隆到工作区后,请将 -DWITH_FASTCV=ON 标志添加到 cmake 变量中,如下所示,添加到 opencv/platforms/android/default.config.py 中的 arm64 条目,或创建一个新的条目,其中包含启用 FastCV HAL 和/或扩展编译的选项。

    ABI("3", "arm64-v8a", None, 24, cmake_vars=dict(WITH_FASTCV='ON')),
  2. 剩余步骤可以按照 wiki 页面 中提到的进行。

为高通 Linux 编译带有 FastCV 的 OpenCV

注意
:仅 Ubuntu 22.04 支持作为 eSDK 部署的主机平台。
  1. 按照 Qualcomm® Linux 文档安装 eSDK。
  2. 安装 eSDK 后,设置 ESDK_ROOT

    export ESDK_ROOT=<eSDK 安装位置>
  3. 将 SDK 工具和库添加到您的环境中

    source environment-setup-armv8-2a-qcom-linux

    如果您遇到以下消息

    您的环境配置错误,您可能需要“unset LD_LIBRARY_PATH”
    但请首先检查为什么设置了此变量,以及取消设置是否安全。
    在大多数情况下,当设置了 LD_LIBRARY_PATH 时,SDK 将无法正常运行。

    只需取消设置您的主机 LD_LIBRARY_PATH 环境变量:unset LD_LIBRARY_PATH

  4. 克隆 OpenCV 存储库

    将 OpenCV 主存储库和可选的 opencv_contrib 存储库克隆到任何目录中(不需要在 SDK 目录中)。

    git clone https://github.com/opencv/opencv.git
    git clone https://github.com/opencv/opencv_contrib.git
  5. 构建 OpenCV

    创建一个构建目录,导航到该目录,并在那里使用 CMake 构建项目

    mkdir build
    cd build
    cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=aarch64 -DWITH_FASTCV=ON -DBUILD_SHARED_LIBS=ON -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/fastcv/ ../opencv
    make -j$(nproc)

    如果 FastCV 库已更新,请替换位于以下位置的旧 FastCV 库

    <ESDK_PATH>\qcom-wayland_sdk\tmp\sysroots\qcs6490-rb3gen2-vision-kit\usr\lib

    使用在以下位置下载的最新 FastCV 库

    build\3rdparty\fastcv\libs
  6. 验证

    将 OpenCV 库、测试二进制文件和测试数据推送到目标设备。执行 OpenCV 一致性或性能测试。运行时,如果缺少 libwebp.so.7 库,请在以下路径中找到该库并将其推送到目标设备

    <ESDK_PATH>\qcom-wayland_sdk\tmp\sysroots\qcs6490-rb3gen2-vision-kit\usr\lib\libwebp.so.7

API 的 HAL 和扩展列表

基于 FastCV 的 OpenCV HAL API 列表

OpenCV 模块OpenCV API用于 OpenCV 加速的底层 FastCV API
IMGPROCmedianBlurfcvFilterMedian3x3u8_v3
sobelfcvFilterSobel3x3u8s16
fcvFilterSobel5x5u8s16
fcvFilterSobel7x7u8s16
boxFilterfcvBoxFilter3x3u8_v3
fcvBoxFilter5x5u8_v2
fcvBoxFilterNxNf32
adaptiveThresholdfcvAdaptiveThresholdGaussian3x3u8_v2
fcvAdaptiveThresholdGaussian5x5u8_v2
fcvAdaptiveThresholdMean3x3u8_v2
fcvAdaptiveThresholdMean5x5u8_v2
pyrDownfcvPyramidCreateu8_v4
cvtColorfcvColorRGB888toYCrCbu8_v3
fcvColorRGB888ToHSV888u8
gaussianBlurfcvFilterGaussian5x5u8_v3
fcvFilterGaussian3x3u8_v4
warpPerspectivefcvWarpPerspectiveu8_v5
CannyfcvFilterCannyu8
CORElutfcvTableLookupu8
normfcvHammingDistanceu8
multiplyfcvElementMultiplyu8u16_v2
transposefcvTransposeu8_v2
fcvTransposeu16_v2
fcvTransposef32_v2
meanStdDevfcvImageIntensityStats_v2
flipfcvFlipu8
fcvFlipu16
fcvFlipRGB888u8
rotatefcvRotateImageu8
fcvRotateImageInterleavedu8
multiplyfcvElementMultiplyu8
fcvElementMultiplys16
fcvElementMultiplyf32
addWeightedfcvAddWeightedu8_v2
subtractfcvImageDiffu8f32_v2
SVD & solvefcvSVDf32_v2
gemmfcvMatrixMultiplyf32_v2
fcvMultiplyScalarf32
fcvAddf32_v2

基于 FastCV 的 OpenCV 扩展 API 列表

这些 OpenCV 扩展 API 在 cv::fastcv 命名空间下实现。

OpenCV 扩展 API用于 OpenCV 加速的底层 FastCV API
matmuls8s32fcvMatrixMultiplys8s32
clusterEuclideanfcvClusterEuclideanu8
FAST10fcvCornerFast10InMaskScoreu8
fcvCornerFast10InMasku8
fcvCornerFast10Scoreu8
fcvCornerFast10u8
FFTfcvFFTu8
IFFTfcvIFFTf32
fillConvexPolyfcvFillConvexPolyu8
houghLinesfcvHoughLineu8
momentsfcvImageMomentsu8
fcvImageMomentss32
fcvImageMomentsf32
runMSERfcvMserInit
fcvMserNN8Init
fcvMserExtu8_v3
fcvMserExtNN8u8
fcvMserNN8u8
fcvMserRelease
remapfcvRemapu8_v2
remapRGBAfcvRemapRGBA8888BLu8
fcvRemapRGBA8888NNu8
resizeDownfcvScaleDownBy2u8_v2
fcvScaleDownBy4u8_v2
fcvScaleDownMNInterleaveu8
fcvScaleDownMNu8
meanShiftfcvMeanShiftu8
fcvMeanShifts32
fcvMeanShiftf32
bilateralRecursivefcvBilateralFilterRecursiveu8
thresholdRangefcvFilterThresholdRangeu8_v2
bilateralFilterfcvBilateralFilter5x5u8_v3
fcvBilateralFilter7x7u8_v3
fcvBilateralFilter9x9u8_v3
calcHistfcvImageIntensityHistogram
gaussianBlurfcvFilterGaussian3x3u8_v4
fcvFilterGaussian5x5u8_v3
fcvFilterGaussian5x5s16_v3
fcvFilterGaussian5x5s32_v3
fcvFilterGaussian11x11u8_v2
filter2DfcvFilterCorrNxNu8
fcvFilterCorrNxNu8s16
fcvFilterCorrNxNu8f32
sepFilter2DfcvFilterCorrSepMxNu8
fcvFilterCorrSep9x9s16_v2
fcvFilterCorrSep11x11s16_v2
fcvFilterCorrSep13x13s16_v2
fcvFilterCorrSep15x15s16_v2
fcvFilterCorrSep17x17s16_v2
fcvFilterCorrSepNxNs16
sobel3x3u8fcvImageGradientSobelPlanars8_v2
sobel3x3u8fcvImageGradientSobelPlanars16_v2
sobel3x3u8fcvImageGradientSobelPlanars16_v3
sobel3x3u8fcvImageGradientSobelPlanarf32_v2
sobel3x3u8fcvImageGradientSobelPlanarf32_v3
sobelfcvFilterSobel3x3u8_v2
fcvFilterSobel3x3u8s16
fcvFilterSobel5x5u8s16
fcvFilterSobel7x7u8s16
DCTfcvDCTu8
iDCTfcvIDCTs16
sobelPyramidfcvPyramidAllocate
fcvPyramidAllocate_v2
fcvPyramidAllocate_v3
fcvPyramidSobelGradientCreatei8
fcvPyramidSobelGradientCreatei16
fcvPyramidSobelGradientCreatef32
fcvPyramidDelete
fcvPyramidDelete_v2
fcvPyramidCreatef32_v2
fcvPyramidCreateu8_v4
trackOpticalFlowLKfcvTrackLKOpticalFlowu8_v3
fcvTrackLKOpticalFlowu8
warpPerspective2Planefcv2PlaneWarpPerspectiveu8
warpPerspectivefcvWarpPerspectiveu8_v5
arithmetic_opfcvAddu8
fcvAdds16_v2
fcvAddf32
fcvSubtractu8
fcvSubtracts16
integrateYUVfcvIntegrateImageYCbCr420PseudoPlanaru8
normalizeLocalBoxfcvNormalizeLocalBoxu8
fcvNormalizeLocalBoxf32
mergefcvChannelCombine2Planesu8
fcvChannelCombine3Planesu8
fcvChannelCombine4Planesu8
splitfcvDeinterleaveu8
fcvChannelExtractu8
warpAffinefcvTransformAffineu8_v2
fcvTransformAffineClippedu8_v3
fcv3ChannelTransformAffineClippedBCu8

基于 FastCV QDSP 的 OpenCV 扩展 API 列表: 这些 OpenCV 扩展 API 在 cv::fastcv::dsp 命名空间下实现。此命名空间提供了优化的实现,利用 FastCV 的 Q 后缀 API 使用 QDSP(高通数字信号处理器)加速。这些函数需要 DSP 初始化 (fcvQ6Init)。

OpenCV 扩展 API用于 OpenCV 加速的底层 FastCV API
filter2DfcvFilterCorr3x3s8_v2Q
fcvFilterCorrNxNu8Q
fcvFilterCorrNxNu8s16Q
fcvFilterCorrNxNu8f32Q
FFTfcvFFTu8Q
IFFTfcvIFFTf32Q
fcvdspinitfcvQ6Init
fcvdspdeinitfcvQ6DeInit
CannyfcvFilterCannyu8Q
sumOfAbsoluteDiffsfcvSumOfAbsoluteDiffs8x8u8_v2Q
thresholdOtsufcvFilterThresholdOtsuu8Q

如何使用基于 FastCV QDSP 的 OpenCV 扩展 API

本节概述了使用 FastCV 在 QDSP(高通数字信号处理器)上加速的 OpenCV 扩展 API 所需的基本步骤。

  1. 初始化 QDSP
  2. 使用 高通的内存分配器 为所有被馈送到 OpenCV 扩展 API 的缓冲区分配内存。
    • 使用 cv::fastcv::getQcAllocator() 将分配器分配给缓冲区。
    • 示例:cv::Mat src; src.allocator = cv::fastcv::getQcAllocator(); **// 设置高通的内存分配器** \ 设置高通的内存分配器后,使用 src.create(...)、cv::imread(...) 等方法创建的任何缓冲区都将使用高通的内存分配器分配其内存。
  3. 从 'cv::fastcv::dsp' 调用 OpenCV 扩展 API
    • 示例:cv::fastcv::dsp::thresholdOtsu(src, dst, binaryType); 其中 'src' 和 'dst' 是具有高通内存分配器的 'cv::Mat' 对象,     'binaryType' 是指示阈值模式的布尔值。
  4. 取消初始化 QDSP

参考示例:参考在 opencv_contrib 存储库中使用 OpenCV 扩展 API 的有效测试用例:opencv_contrib/modules/fastcv/test/test_thresh_dsp.cpp