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