OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
FastCVを用いたOpenCVのビルド

互換性OpenCV >= 4.11.0

Qualcommチップセット向けにFastCVを有効にしたOpenCV

本ドキュメントの範囲は、ARM64 アーキテクチャの Qualcomm チップセットにおいて FastCV を用いた OpenCV のアクセラレーションを有効化する手順を開発者に案内することである。Qualcomm 以外のチップセットや、Qualcomm Linux 以外の Linux プラットフォームで FastCV バックエンドを用いた OpenCV を有効化することは、現時点では範囲外である。

FastCVについて

FastCV はコンピュータビジョンアプリケーション開発者に2つの主要な機能を提供する。

  • よく使われるコンピュータビジョン(CV)関数のライブラリ。Qualcomm の多種多様な Snapdragon デバイス上で効率的に動作するよう最適化されている。
  • プロセッサに依存しないクリーンなハードウェアアクセラレーション API。これによりチップセットベンダーは Qualcomm の Snapdragon ハードウェア上で FastCV 関数をハードウェアアクセラレーションできる。

FastCV は統合バイナリ、すなわちアルゴリズムの2つの実装を含む単一のバイナリとしてリリースされている。

  • 汎用実装は Arm® アーキテクチャ上で動作し、FastCV for Arm architecture と呼ばれる。
  • Qualcomm® Snapdragon™ チップセット上でのみ動作する実装であり、FastCV for Snapdragon と呼ばれる。

FastCV ライブラリは Qualcomm 独自のものであり、他の CV ライブラリと比較してさまざまなハードウェア上での CV アルゴリズムのより高速な実装を提供する。

FastCV HALおよび拡張機能によるOpenCVの高速化

OpenCV と FastCV の統合は次の2通りの方法で実装されている:

  1. 基本的なコンピュータビジョンおよび算術アルゴリズムを高速化する FastCV ベースの HAL。
  2. 汎用的な OpenCV のインターフェースや動作に収まらない独自アルゴリズムや FastCV 関数のラッパーを提供する、opencv_contrib 内の FastCV モジュール。

サポートされているプラットフォーム

  1. Android : Snapdragon 8 Gen 1 以降の Android を搭載した Qualcomm チップセット(https://www.qualcomm.com/products/mobile/snapdragon/smartphones#product-list)
  2. Linux : Hardware に記載されている Qualcomm Linux Program 関連ボード

Android向けにFastCVを用いてOpenCVをコンパイルする

  1. OpenCV のコンパイルについては Wiki ページを参照すること : https://github.com/opencv/opencv/wiki/Custom-OpenCV-Android-SDK-and-AAR-package-build

    OpenCV リポジトリのコードをワークスペースにクローンしたら、FastCV HAL および/または拡張機能のコンパイルを有効にするため、以下のように -DWITH_FASTCV=ON フラグを opencv/platforms/android/default.config.py 内の arm64 エントリの cmake 変数に追加するか、このオプションを指定して新しいエントリを作成すること:

    ABI("3", "arm64-v8a", None, 24, cmake_vars=dict(WITH_FASTCV='ON')),
  2. 残りの手順は the wiki page に記載されているとおりに進めればよい

Qualcomm Linux向けにFastCVを用いてOpenCVをコンパイルする

覚え書き
: eSDK のデプロイにおいて、ホストプラットフォームとしてサポートされるのは Ubuntu 22.04 のみである。
  1. Qualcomm® Linux Documentation に従って eSDK をインストールする
  2. eSDK のインストール後、ESDK_ROOT を設定する:

    export ESDK_ROOT=<eSDK install location>
  3. SDK のツールとライブラリを環境に追加する:

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

    次のメッセージが表示された場合:

    Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'
    but please check why this was set in the first place and that it's safe to unset.
    The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set.

    ホストの LD_LIBRARY_PATH 環境変数を解除するだけでよい: unset LD_LIBRARY_PATH

  4. OpenCV のリポジトリをクローンする:

    OpenCV の main リポジトリと、必要に応じて 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

HALおよび拡張機能のAPI一覧

FastCV ベースの OpenCV HAL API 一覧:

OpenCV モジュールOpenCV APIOpenCV の高速化に用いる基盤の 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拡張APIOpenCV の高速化に用いる基盤の 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 (Qualcomm's Digital Signal Processor) による高速化を活用する最適化実装を提供する。これらの関数は DSP の初期化 (fcvQ6Init) を必要とする。

OpenCV拡張APIOpenCV の高速化に用いる基盤の FastCV API
filter2DfcvFilterCorr3x3s8_v2Q
fcvFilterCorrNxNu8Q
fcvFilterCorrNxNu8s16Q
fcvFilterCorrNxNu8f32Q
FFTfcvFFTu8Q
IFFTfcvIFFTf32Q
fcvdspinitfcvQ6Init
fcvdspdeinitfcvQ6DeInit
CannyfcvFilterCannyu8Q
sumOfAbsoluteDiffsfcvSumOfAbsoluteDiffs8x8u8_v2Q
thresholdOtsufcvFilterThresholdOtsuu8Q

FastCV QDSP ベースの OpenCV 拡張 API の使い方

本節では、QDSP(Qualcomm's Digital Signal Processor) 上で FastCV により高速化される OpenCV 拡張 API を使用するために必要な基本手順を概説する。

  1. Initialize QDSP:
  2. Allocate memory using Qualcomm's memory allocator for all buffers that are being fed to the OpenCV extension API.:
    • cv::fastcv::getQcAllocator() を使ってバッファにアロケータを割り当てる。
    • 例: cv::Mat src; src.allocator = cv::fastcv::getQcAllocator(); **// Qualcommのメモリアロケータを設定する** \ Qualcommのメモリアロケータを設定した後は、src.create(...) や cv::imread(...) などのメソッドで作成されたバッファは、そのメモリがQualcommのメモリアロケータを用いて割り当てられる。
  3. Call the OpenCV extension API from 'cv::fastcv::dsp':
    • 例: cv::fastcv::dsp::thresholdOtsu(src, dst, binaryType); ここで 'src' と 'dst' はQualcommのメモリアロケータを持つ 'cv::Mat' オブジェクトであり、'binaryType' はしきい値処理のモードを示すブール値である。
  4. Deinitialize QDSP:

参考例: opencv_contrib リポジトリにある、OpenCV 拡張 API を使用した動作するテストケースを参照すること:opencv_contrib/modules/fastcv/test/test_thresh_dsp.cpp