0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows向けのOPENCVのビルドでいろいろ苦労した話

Last updated at Posted at 2025-09-13

自作物体検出アプリの処理速度を改善したい!

動画から物体検出するアプリの画像処理にOPENCVを利用しています。
物体検出はTensorRT、DirectMLで行っていますが、どちらで実行しても私の環境ではGPU負荷が50%に満たない程度となっていました。もっとGPUを使うことができればさらに高速に処理できるのではないか?と思っていたものの、原因がよくわからずモヤモヤしていました。(何かハードウェア負荷を制限・解除するようなオプションがいるのかなー?とか思ってた)
Windows Copilotとそんなやり取りをしていると、OPENCV-CUDAやOPENCV-OPENCLなどのハードウェアサポートを利用することや並列処理を行うことでスループットがあがり、またGPU負荷も上がってくるのではないか?と提案されました。
なるほど、アプリの動画の入出力は別スレッドになっていますが、前処理>物体検出>後処理>画像処理は、同期処理となっており、GPUに待ちが発生している可能性がありそうかも?
また前処理や後処理、画像処理にはプリビルドのOPENCVを利用しており、CPU処理となっていたので、GPUの待ちが発生しやすい状況となっている可能性もありそうです。
さらにいえば、各処理を非同期処理にすればスループットがさらにあがるのではないか?

非同期化するのは私にとっては結構大変なので、まずは着手しやすそうなOPENCVのハードウェアサポートを有効にしスループットの改善に着手してみることにしました。
OPENCVのビルドから。

環境

Windows11pro
OPENCV 4.13dev
VisualStudio2022
INTEL 11400F
NVIDIA GEFORCE 4070TiS

OPENCVのビルドオプションの選定

OPENCLはともかく、CUDAはOPENCVをビルドしないといけません。
またアプリを配布するので、なんでもかんでもビルドするのではなく、必要な機能に厳選した状態でビルドした方がビルド時間もファイルサイズも良いだろう、と考え、アプリで利用しているOPENCVの機能をCopilotに投げかけて、必要なCUDAの機能を確認しました。

アプリで使ってるOPENCVの機能(順不同、漏れもあるかも)

  • resize
  • copyTo
  • convertTo
  • GaussianBlur
  • imread
  • imwrite
  • dnn::NMSBoxes
  • rectangle
  • inpaint
  • dnn::blobFromImage

適用したビルドオプション

CUDA関係

  • BUILD_opencv_cudaarithm
  • BUILD_opencv_cudafileters
  • BUILD_opencv_cudaimgproc
  • BUILD_opencv_cudawarping
  • BUILD_opencv_cudadev
  • CUDA_FAST_MATH
  • WITH_CUDA
  • CUDA_USE_STATIC_CUDA_RUNTIME
  • CUDA_ARCH_BIN 7.5;8.6;8.9;12.0
  • CUDA_ARCH_PTX 7.5;8.6;8.9;12.0

OPENCL関係

  • WITH_OPENCL
  • WITH_OPENCL_SVM

OPENCV標準モジュール関係

  • BUILD_opencv_dnn
  • BUILD_opencv_imgcodecs
  • BUILD_opencv_imgproc
  • BUILD_opencv_photo
  • BUILD_opencv_world

ビルドオプション選定の理由

標準モジュールもデフォルト入ってくるVIDEOIOやWITH_FFMPEG、HIGHGUI、GAPIやADEなど使わないものは外しました。
CUDA、OPENCLも、使わない機能は入れていません。CUDNNやOPENCV_DNN_OPENCLがないのは、物体検出自体はTensorRTやDirectMLで行うようにしており、NMSBoxesなんかでは機能しないらしいからです。CPU処理になるんだとか。
また例えばInpaintなんかはCUDA、OPENCLではサポートされておらず、CPU処理になるんだとか?
じゃあ、CPUで処理する時でも、ちょっとでも早くする方法はないのかな?

OPENCVのCPU関係のビルドオプション

OPENCVでは、IPPやTBBというものがCPUのハードウェアサポートらしいです。

IPPとは(Intel® Integrated Performance Primitives)

インテル® インテグレーテッド・パフォーマンス・プリミティブ(インテル® IPP)は、多様なインテルアーキテクチャ向けに高度に最適化された、すぐに使えるドメイン固有関数の広範なライブラリです。ロイヤリティフリーのAPIは、開発者に以下のメリットをもたらします。

  • SIMD(単一命令複数データ)命令を活用する
  • 信号処理、データ圧縮、画像処理、ビデオ処理、コンピューター ビジョンなどの計算集約型アプリケーションのパフォーマンスを向上させます。
  • ソフトウェア開発と保守にかかるコストと市場投入までの時間を削減

SIMDという仕組みを使って処理速度を向上させるもののようです。

TBBとは(Intel® oneAPI Threading Building Blocks)

並列アプリケーションの簡素化された開発
インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB)† は、スレッド化の専門家でなくても、アクセラレーションされたアーキテクチャー全体にわたって複雑なアプリケーションに並列処理を追加する作業を簡素化する柔軟なパフォーマンス・ライブラリーです。
oneTBB は、次のような幅広い計算負荷の高いドメインに最適です。

こちらはスレッドを利用して処理速度を向上させるもののようです。

OPENCVでIPP、TBBを有効にする

それぞれ、WITH_IPP、WITH_TBBを有効にすれば適用されるようですが、Windowsではそれぞれ別に準備する必要がありました。

補足追記
TBBからインストールすると、IPPがcmakeの自動ダウンロードキャッシュを使わなくなりました。TBBとIPPを両方使いたい時は、両方準備する必要があります。
IPPのみだと、自動でダウンロードされたものを利用してくれるようです

IPPの場合

こちらからダウンロードし、インストールしてください。

私は次のオプションを有効にしました。

  • WITH_IPP
  • BUILD_IPP_IW
  • OPENCV_IPP_ENABLE_ALL

TBBの場合

こちらから最新のWindowsリリースをダウンロードして展開ください。

CMAKEでは、TBB_DIR というとこで、TBBのCMAKEのファイルがあるところを指定すると良い感じに適用してくれます。

  • WITH_TBB
  • TBB_DIR D:/oneapi-tbb-2022.2.0/lib/cmake/tbb


私はTBB、IPPと順に個別にいれましたが、もしかするとintelのoneAPIというものをいれると丸っと全部インスコできたのかもしれません

さぁ、ベンチマークの時間だ!

OPENCVでIPP、TBBを有効にする方法がよくわからなくて、ここに来るまでに軽く2,3日はかかっていたりします。
IPP、TBBはOPENCVで有効になっていれば、特に何の指定をしていなくても勝手に有効になって、勝手にいい感じに速くしてくれるそうです。
またIPPはよくわかりませんが、TBBはAMDのCPUでも問題なく動作する模様。
これは入れない手はないね!

ベンチマークのコード

ベンチマークのコードは生成AIに作成してもらいました。
GPUメモリへのコピーがループの外にあるなー、とは思いましたが
試しにループの中に入れてもやっぱり速かったのでとりあえず外側のままに。
nmsやinpaintも無理やり入れています。inpaintは重すぎたので3回にしました。
TBBは、実行ファイルと同じフォルダにTBB.DLLを入れる必要がありました。

ベンチマークのコード
bench.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/dnn.hpp>            // NMSBoxes 用
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafilters.hpp>
#include <opencv2/cudawarping.hpp>
#include <chrono>
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>                    // setw のため
#include <cuda_runtime.h> // 追加: CUDAランタイムAPIのヘッダ


using namespace cv;
using namespace std;
using Clock = chrono::high_resolution_clock;

// 操作ごとの計測結果をまとめる構造体
struct OpTimes {
    double resize = 0;
    double cvtColor = 0;
    double blur = 0;
    double nms = 0;
    double inpaint = 0;
    double total = 0;
    string name;
};

// CPU 用ベンチ:IPP/スレッド設定を変えながら測定
OpTimes benchCPU(
    const Mat& src, int iter,
    bool useIPP, int threads,
    const string& label)
{
    // 初期設定
    //setUseOptimized(useIPP);
    //setNumThreads(threads);

    // NMSBoxes 用データを事前生成
    RNG rng(42);
    vector<Rect> boxes;
    vector<float> scores;
    const int numBoxes = 100;
    for (int i = 0; i < numBoxes; ++i) {
        int x = rng.uniform(0, src.cols - 100);
        int y = rng.uniform(0, src.rows - 100);
        boxes.emplace_back(x, y, rng.uniform(20, 100), rng.uniform(20, 100));
        scores.push_back(rng.uniform(0.0f, 1.0f));
    }
    const float scoreThresh = 0.5f, nmsThresh = 0.4f;
    vector<int> indices;

    // inpaint 用マスクを一度だけ生成
    Mat mask(src.size(), CV_8UC1);
    randu(mask, Scalar::all(0), Scalar::all(2));
    threshold(mask, mask, 0, 255, THRESH_BINARY);
    Mat inpaintDst;

    OpTimes t;
    t.name = label;

    // トータル計測開始
    auto tot0 = Clock::now();

    for (int i = 0; i < iter; ++i) {
        Mat dst, gray;

        // --- resize ---
        auto s0 = Clock::now();
        resize(src, dst, Size(), 0.5, 0.5, INTER_LINEAR);
        auto e0 = Clock::now();
        t.resize += chrono::duration<double, milli>(e0 - s0).count();

        // --- cvtColor ---
        s0 = Clock::now();
        cvtColor(dst, gray, COLOR_BGR2GRAY);
        e0 = Clock::now();
        t.cvtColor += chrono::duration<double, milli>(e0 - s0).count();

        // --- GaussianBlur ---
        s0 = Clock::now();
        GaussianBlur(gray, gray, Size(15, 15), 1.5, 1.5);
        e0 = Clock::now();
        t.blur += chrono::duration<double, milli>(e0 - s0).count();

        // --- NMSBoxes ---
        s0 = Clock::now();
        dnn::NMSBoxes(boxes, scores, scoreThresh, nmsThresh, indices);
        e0 = Clock::now();
        t.nms += chrono::duration<double, milli>(e0 - s0).count();

    }
    const int inpaintIter = 3;  // 3回は実行(遅いから
    auto s_inpaint = Clock::now();
    for (int j = 0; j < inpaintIter; ++j) {
        inpaint(src, mask, inpaintDst, 3.0, INPAINT_TELEA);
    }
    auto e_inpaint = Clock::now();
    t.inpaint += chrono::duration<double, milli>(e_inpaint - s_inpaint).count();

    auto tot1 = Clock::now();
    t.total = chrono::duration<double, milli>(tot1 - tot0).count();
    return t;
}

// OpenCL ベンチ:UMat を使って同じ処理(nms/inpaint は 0 のまま)
OpTimes benchOpenCL(const Mat& src, int iter) {
    OpTimes t;
    t.name = "OpenCL";
    if (!ocl::haveOpenCL()) { cerr << "OpenCL not available\n"; return t; }
    ocl::setUseOpenCL(true);

    UMat u_src, u_tmp, u_gray;
    src.copyTo(u_src);

    auto tot0 = Clock::now();
    for (int i = 0; i < iter; ++i) {
        // resize
        auto s0 = Clock::now();
        resize(u_src, u_tmp, Size(src.cols / 2, src.rows / 2),
            0, 0, INTER_LINEAR);
        ocl::finish();
        auto e0 = Clock::now();
        t.resize += chrono::duration<double, milli>(e0 - s0).count();

        // cvtColor
        s0 = Clock::now();
        cvtColor(u_tmp, u_gray, COLOR_BGR2GRAY);
        ocl::finish();
        e0 = Clock::now();
        t.cvtColor += chrono::duration<double, milli>(e0 - s0).count();

        // blur
        s0 = Clock::now();
        GaussianBlur(u_gray, u_gray, Size(15, 15), 1.5, 1.5);
        ocl::finish();
        e0 = Clock::now();
        t.blur += chrono::duration<double, milli>(e0 - s0).count();
    }
    t.total = chrono::duration<double, milli>(
        Clock::now() - tot0).count();
    return t;
}

// CUDA ベンチ:GpuMat を使って同じ処理(nms/inpaint は 0 のまま)
OpTimes benchCUDA(const Mat& src, int iter) {
    OpTimes t;
    t.name = "CUDA";
    if (!cuda::getCudaEnabledDeviceCount()) { cerr << "No CUDA device\n"; return t; }
    cuda::setDevice(0);

    cuda::GpuMat g_src, g_tmp, g_gray;
    g_src.upload(src);
    Ptr<cuda::Filter> gauss = cuda::createGaussianFilter(
        CV_8UC1, CV_8UC1, Size(15, 15), 1.5);

    auto tot0 = Clock::now();
    for (int i = 0; i < iter; ++i) {
        // resize
        auto s0 = Clock::now();
        cuda::resize(g_src, g_tmp, Size(src.cols / 2, src.rows / 2));
        cudaDeviceSynchronize();
        auto e0 = Clock::now();
        t.resize += chrono::duration<double, milli>(e0 - s0).count();

        // cvtColor
        s0 = Clock::now();
        cuda::cvtColor(g_tmp, g_gray, COLOR_BGR2GRAY);
        cudaDeviceSynchronize();
        e0 = Clock::now();
        t.cvtColor += chrono::duration<double, milli>(e0 - s0).count();

        // blur
        s0 = Clock::now();
        gauss->apply(g_gray, g_gray);
        cudaDeviceSynchronize();
        e0 = Clock::now();
        t.blur += chrono::duration<double, milli>(e0 - s0).count();
    }
    t.total = chrono::duration<double, milli>(
        Clock::now() - tot0).count();
    return t;
}

int main() {
    const int W = 3840, H = 2160, ITER = 10000;
    Mat src(H, W, CV_8UC3);
    randu(src, Scalar::all(0), Scalar::all(255));

    int maxTh = getNumberOfCPUs();
    cout << "Image: " << W << "x" << H
        << ", iter=" << ITER
        << ", CPU cores=" << maxTh << "\n\n";

    // 全設定でベンチ実行
    vector<OpTimes> results;
    results.push_back(benchCPU(src, ITER, true, maxTh, "CPU"));
    results.push_back(benchOpenCL(src, ITER));
    results.push_back(benchCUDA(src, ITER));

    // 表形式で出力
    cout << left
        << setw(12) << "Device"
        << setw(12) << "resize(ms)"
        << setw(12) << "cvtColor(ms)"
        << setw(12) << "blur(ms)"
        << setw(12) << "nms(ms)"
        << setw(12) << "inpaint(ms)"
        << setw(12) << "total(ms)" << "\n";

    for (auto& t : results) {
        cout << left
            << setw(12) << t.name
            << setw(12) << t.resize
            << setw(12) << t.cvtColor
            << setw(12) << t.blur
            << setw(12) << t.nms
            << setw(12) << t.inpaint
            << setw(12) << t.total << "\n";
    }

    return 0;
}

結果

IPP,TBB,OPENCV 4.13dev
Image: 3840x2160, iter=10000, CPU cores=12

Device      resize(ms)  cvtColor(ms)blur(ms)    nms(ms)     inpaint(ms) total(ms)
CPU         11832.6     4549.64     35238.2     261.577     15318.5     72315.3
OpenCL      574.691     443.269     12156       0           0           13175
CUDA        285.954     200.929     823.59      0           0           1314.66

ふむふむ。
あ、比較用に、今メインに使ってるprebuildのOPENCV 4.10でも試してみようかな?少なくともTBBはないはず!cudaはビルドされて無いからコメントアウトで!

OEPNCV 4.10 prebuild
Image: 3840x2160, iter=10000, CPU cores=12

Device      resize(ms)  cvtColor(ms)blur(ms)    nms(ms)     inpaint(ms) total(ms)
CPU         11205.3     3808.8      19499.2     222.741     15306.7     54227.5
OpenCL      507.62      368.223     11704.7     0           0           12581.6

あれ?

ベンチマークしたOPENCVのBuildInformationを貼っておきます。

OpenCV 4.13dev,4.10のBuildInformation
opencv_buildinfo.cpp
#include <opencv2/core.hpp>
#include <iostream>

int main() {
    std::cout << cv::getBuildInformation() << std::endl;
    return 0;
}

OPENCV 4.13dev BuildInformation
General configuration for OpenCV 4.13.0-dev =====================================
  Version control:               4.12.0-147-gb3f6c86d47

  Platform:
    Timestamp:                   2025-09-12T21:21:08Z
    Host:                        Windows 10.0.26100 AMD64
    CMake:                       4.1.1
    CMake generator:             Visual Studio 17 2022
    CMake build tool:            C:/Program Files/Microsoft Visual Studio/2022/Community/MSBuild/Current/Bin/amd64/MSBuild.exe
    MSVC:                        1944
    Configuration:               Release
    Algorithm Hint:              ALGO_HINT_ACCURATE

  CPU/HW features:
    Baseline:                    SSE SSE2 SSE3
      requested:                 SSE3

  C/C++:
    Built as dynamic libs?:      YES
    C++ standard:                11
    C++ Compiler:                C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe  (ver 19.44.35216.0)
    C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /wd4819 /MP -openmp  /O2 /Ob2 /DNDEBUG
    C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /wd4819 /MP -openmp  /Zi /Ob0 /Od /RTC1
    C Compiler:                  C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe
    C flags (Release):           /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /MP -openmp   /O2 /Ob2 /DNDEBUG
    C flags (Debug):             /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /MP -openmp /Zi /Ob0 /Od /RTC1
    Linker flags (Release):      /machine:x64  /INCREMENTAL:NO
    Linker flags (Debug):        /machine:x64  /debug /INCREMENTAL
    ccache:                      NO
    Precompiled headers:         NO
    Extra dependencies:          cudart_static.lib nppc.lib nppial.lib nppicc.lib nppidei.lib nppif.lib nppig.lib nppim.lib nppist.lib nppisu.lib nppitc.lib npps.lib cufft.lib -LIBPATH:C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.9/lib/x64
    3rdparty dependencies:

  OpenCV modules:
    To be built:                 core cudaarithm cudafilters cudaimgproc cudawarping cudev dnn imgcodecs imgproc photo world
    Disabled:                    aruco bgsegm bioinspired calib3d ccalib cudabgsegm cudacodec cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo datasets dnn_objdetect dnn_superres dpm face features2d flann fuzzy hfs highgui img_hash intensity_transform java_bindings_generator js_bindings_generator line_descriptor mcc ml objc_bindings_generator objdetect optflow phase_unwrapping plot python3 python_bindings_generator python_tests quality rapid reg rgbd saliency shape signal stereo stitching structured_light superres surface_matching text tracking video videoio videostab wechat_qrcode xfeatures2d ximgproc xobjdetect xphoto
    Disabled by dependency:      -
    Unavailable:                 alphamat cannops cvv fastcv freetype gapi hdf java julia matlab ovis python2 python2 sfm ts viz
    Applications:                -
    Documentation:               NO
    Non-free algorithms:         NO

  Windows RT support:            NO

  GUI:
    Win32 UI:                    YES
    VTK support:                 NO

  Media I/O:
    ZLib:                        build (ver 1.3.1)
    JPEG:                        build-libjpeg-turbo (ver 3.1.0-70)
      SIMD Support Request:      YES
      SIMD Support:              NO
    WEBP:                        build (ver decoder: 0x0209, encoder: 0x020f, demux: 0x0107)
    AVIF:                        NO
    PNG:                         build (ver 1.6.45)
      SIMD Support Request:      YES
      SIMD Support:              YES (Intel SSE)
    TIFF:                        build (ver 42 - 4.7.0)
    JPEG 2000:                   build (ver 2.5.3)
    OpenEXR:                     build (ver 2.3.0)
    GIF:                         YES
    HDR:                         YES
    SUNRASTER:                   YES
    PXM:                         YES
    PFM:                         YES

  Video I/O:

  Parallel framework:            TBB (ver 2022.2 interface 12160)

  Trace:                         YES (with Intel ITT(3.25.4))

  Other third-party libraries:
    Intel IPP:                   2022.2.0 [2022.2.0]
           at:                   D:/opencv_build2/3rdparty/ippicv/ippicv_win/icv
    Intel IPP IW:                sources (2022.2.0)
              at:                D:/opencv_build2/3rdparty/ippicv/ippicv_win/iw
    Custom HAL:                  YES (ipp (ver 0.0.1))
    Protobuf:                    build (3.19.1)
    Flatbuffers:                 builtin/3rdparty (23.5.9)

  NVIDIA CUDA:                   YES (ver 12.9, CUFFT FAST_MATH)
    NVIDIA GPU arch:             75 86 89 120
    NVIDIA PTX archs:            75 86 89 120

  OpenCL:                        YES (SVM)
    Include path:                D:/opencv/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load

  Python (for build):            C:/Users/*****/AppData/Local/Microsoft/WindowsApps/python3.exe

  Install to:                    D:/opencv_build2/install
-----------------------------------------------------------------
OEPNCV 4.10 prebuild BuildInformation
General configuration for OpenCV 4.10.0 =====================================
  Version control:               4.10.0

  Platform:
    Timestamp:                   2024-06-02T16:42:08Z
    Host:                        Windows 10.0.19045 AMD64
    CMake:                       3.23.3
    CMake generator:             Visual Studio 16 2019
    CMake build tool:            C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/MSBuild.exe
    MSVC:                        1929
    Configuration:               Debug Release

  CPU/HW features:
    Baseline:                    SSE SSE2 SSE3
      requested:                 SSE3
    Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
      requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
      SSE4_1 (16 files):         + SSSE3 SSE4_1
      SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
      FP16 (0 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
      AVX (8 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
      AVX2 (36 files):           + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
      AVX512_SKX (5 files):      + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_COMMON AVX512_SKX

  C/C++:
    Built as dynamic libs?:      YES
    C++ standard:                11
    C++ Compiler:                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe  (ver 19.29.30154.0)
    C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:precise     /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /wd4819 /MP  /O2 /Ob2 /DNDEBUG
    C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:precise     /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /wd4819 /MP  /Zi /Ob0 /Od /RTC1
    C Compiler:                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe
    C flags (Release):           /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:precise     /MP   /O2 /Ob2 /DNDEBUG
    C flags (Debug):             /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:precise     /MP /Zi /Ob0 /Od /RTC1
    Linker flags (Release):      /machine:x64  /INCREMENTAL:NO
    Linker flags (Debug):        /machine:x64  /debug /INCREMENTAL
    ccache:                      NO
    Precompiled headers:         NO
    Extra dependencies:
    3rdparty dependencies:

  OpenCV modules:
    To be built:                 calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo stitching video videoio world
    Disabled:                    python3
    Disabled by dependency:      -
    Unavailable:                 java python2 ts
    Applications:                apps
    Documentation:               NO
    Non-free algorithms:         NO

  Windows RT support:            NO

  GUI:
    Win32 UI:                    YES
    VTK support:                 NO

  Media I/O:
    ZLib:                        build (ver 1.3.1)
    JPEG:                        build-libjpeg-turbo (ver 3.0.3-70)
      SIMD Support Request:      YES
      SIMD Support:              NO
    WEBP:                        build (ver encoder: 0x020f)
    PNG:                         build (ver 1.6.43)
      SIMD Support Request:      YES
      SIMD Support:              YES (Intel SSE)
    TIFF:                        build (ver 42 - 4.6.0)
    JPEG 2000:                   build (ver 2.5.0)
    OpenEXR:                     build (ver 2.3.0)
    HDR:                         YES
    SUNRASTER:                   YES
    PXM:                         YES
    PFM:                         YES

  Video I/O:
    DC1394:                      NO
    FFMPEG:                      YES (prebuilt binaries)
      avcodec:                   YES (58.134.100)
      avformat:                  YES (58.76.100)
      avutil:                    YES (56.70.100)
      swscale:                   YES (5.9.100)
      avresample:                YES (4.0.0)
    GStreamer:                   NO
    DirectShow:                  YES
    Media Foundation:            YES
      DXVA:                      YES

  Parallel framework:            Concurrency

  Trace:                         YES (with Intel ITT)

  Other third-party libraries:
    Intel IPP:                   2021.11.0 [2021.11.0]
           at:                   C:/GHA-OCV-1/_work/ci-gha-workflow/ci-gha-workflow/build/3rdparty/ippicv/ippicv_win/icv
    Intel IPP IW:                sources (2021.11.0)
              at:                C:/GHA-OCV-1/_work/ci-gha-workflow/ci-gha-workflow/build/3rdparty/ippicv/ippicv_win/iw
    Eigen:                       NO
    Custom HAL:                  NO
    Protobuf:                    build (3.19.1)
    Flatbuffers:                 builtin/3rdparty (23.5.9)

  OpenCL:                        YES (NVD3D11)
    Include path:                C:/GHA-OCV-1/_work/ci-gha-workflow/ci-gha-workflow/opencv/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load

  Python (for build):            C:/Python-3.9/python.exe

  Java:
    ant:                         C:/apache-ant-1.9.15/bin/ant.bat (ver 1.9.15)
    Java:                        NO
    JNI:                         C:/Program Files/Java/jdk-11.0.9/include C:/Program Files/Java/jdk-11.0.9/include/win32 C:/Program Files/Java/jdk-11.0.9/include
    Java wrappers:               NO
    Java tests:                  NO

  Install to:                    C:/GHA-OCV-1/_work/ci-gha-workflow/ci-gha-workflow/install
-----------------------------------------------------------------

真犯人はBuildInformationの中に!

4.13dev
image.png
4.10
image.png

CPUのビルドオプションが全然違う!!

CPU_DISPATCHで4.10と同じように複数選べば解決!と思いましたが、cmake_guiではドロップダウンリストで1つしか選べず、どうしたものか?と地味に詰まりました。
困って、解決できたので、もう1つ投稿しました。

さぁベンチマークの時間だ!(2回目)

こちらの記事でparallel_for_などの指示をしないといけないみたいなので、TBBはもういいかなっていうことでIPPのみにしました。

さて、結果はいかに!!

IPP,OPENCV 4.13dev
Image: 3840x2160, iter=10000, CPU cores=12

Device      resize(ms)  cvtColor(ms)blur(ms)    nms(ms)     inpaint(ms) total(ms)
CPU         12050.1     4336.77     21256.4     227.268     15695.3     58157.9
OpenCL      671.903     480.813     12734.7     0           0           13888.5
CUDA        278.912     209.164     824.896     0           0           1313.84
OEPNCV 4.10 prebuild
Image: 3840x2160, iter=10000, CPU cores=12

Device      resize(ms)  cvtColor(ms)blur(ms)    nms(ms)     inpaint(ms) total(ms)
CPU         11205.3     3808.8      19499.2     222.741     15306.7     54227.5
OpenCL      507.62      368.223     11704.7     0           0           12581.6

ん-まだ微妙に差はあるけど、CPU処理となる予定のNMSとINPAINTが近い値になったのでヨシとします!

OpenCV 4.13devのBuildInformation
OPENCV 4.13dev BuildInformation
General configuration for OpenCV 4.13.0-dev =====================================
  Version control:               4.12.0-147-gb3f6c86d47

  Platform:
    Timestamp:                   2025-09-12T21:21:08Z
    Host:                        Windows 10.0.26100 AMD64
    CMake:                       4.1.1
    CMake generator:             Visual Studio 17 2022
    CMake build tool:            C:/Program Files/Microsoft Visual Studio/2022/Community/MSBuild/Current/Bin/amd64/MSBuild.exe
    MSVC:                        1944
    Configuration:               Release
    Algorithm Hint:              ALGO_HINT_ACCURATE

  CPU/HW features:
    Baseline:                    SSE SSE2 SSE3 SSSE3
      requested:                 SSSE3
    Dispatched code generation:  SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
      requested:                 SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
      SSE4_1 (14 files):         + SSE4_1
      SSE4_2 (1 files):          + SSE4_1 POPCNT SSE4_2
      AVX (9 files):             + SSE4_1 POPCNT SSE4_2 AVX
      FP16 (0 files):            + SSE4_1 POPCNT SSE4_2 AVX FP16
      AVX2 (32 files):           + SSE4_1 POPCNT SSE4_2 AVX FP16 AVX2 FMA3
      AVX512_SKX (5 files):      + SSE4_1 POPCNT SSE4_2 AVX FP16 AVX2 FMA3 AVX_512F AVX512_COMMON AVX512_SKX

  C/C++:
    Built as dynamic libs?:      YES
    C++ standard:                11
    C++ Compiler:                C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe  (ver 19.44.35216.0)
    C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /wd4819 /MP  /O2 /Ob2 /DNDEBUG
    C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /wd4819 /MP  /Zi /Ob0 /Od /RTC1
    C Compiler:                  C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe
    C flags (Release):           /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /MP   /O2 /Ob2 /DNDEBUG
    C flags (Debug):             /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast    /MP /Zi /Ob0 /Od /RTC1
    Linker flags (Release):      /machine:x64  /INCREMENTAL:NO
    Linker flags (Debug):        /machine:x64  /debug /INCREMENTAL
    ccache:                      NO
    Precompiled headers:         NO
    Extra dependencies:          cudart_static.lib nppc.lib nppial.lib nppicc.lib nppidei.lib nppif.lib nppig.lib nppim.lib nppist.lib nppisu.lib nppitc.lib npps.lib cufft.lib -LIBPATH:C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.9/lib/x64
    3rdparty dependencies:

  OpenCV modules:
    To be built:                 core cudaarithm cudafilters cudaimgproc cudawarping cudev dnn imgcodecs imgproc photo world
    Disabled:                    aruco bgsegm bioinspired calib3d ccalib cudabgsegm cudacodec cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo datasets dnn_objdetect dnn_superres dpm face features2d flann fuzzy hfs highgui img_hash intensity_transform java_bindings_generator js_bindings_generator line_descriptor mcc ml objc_bindings_generator objdetect optflow phase_unwrapping plot python3 python_bindings_generator python_tests quality rapid reg rgbd saliency shape signal stereo stitching structured_light superres surface_matching text tracking video videoio videostab wechat_qrcode xfeatures2d ximgproc xobjdetect xphoto
    Disabled by dependency:      -
    Unavailable:                 alphamat cannops cvv fastcv freetype gapi hdf java julia matlab ovis python2 python2 sfm ts viz
    Applications:                -
    Documentation:               NO
    Non-free algorithms:         NO

  Windows RT support:            NO

  GUI:
    Win32 UI:                    YES

  Media I/O:
    ZLib:                        build (ver 1.3.1)
    JPEG:                        build-libjpeg-turbo (ver 3.1.0-70)
      SIMD Support Request:      YES
      SIMD Support:              NO
    WEBP:                        build (ver decoder: 0x0209, encoder: 0x020f, demux: 0x0107)
    AVIF:                        NO
    PNG:                         build (ver 1.6.45)
      SIMD Support Request:      YES
      SIMD Support:              YES (Intel SSE)
    TIFF:                        build (ver 42 - 4.7.0)
    JPEG 2000:                   build (ver 2.5.3)
    OpenEXR:                     build (ver 2.3.0)
    GIF:                         YES
    HDR:                         YES
    SUNRASTER:                   YES
    PXM:                         YES
    PFM:                         YES

  Video I/O:

  Parallel framework:            Concurrency

  Trace:                         YES (with Intel ITT(3.25.4))

  Other third-party libraries:
    Intel IPP:                   2022.2.0 [2022.2.0]
           at:                   D:/opencv_build2/3rdparty/ippicv/ippicv_win/icv
    Intel IPP IW:                sources (2022.2.0)
              at:                D:/opencv_build2/3rdparty/ippicv/ippicv_win/iw
    Custom HAL:                  YES (ipp (ver 0.0.1))

  NVIDIA CUDA:                   YES (ver 12.9, CUFFT FAST_MATH)
    NVIDIA GPU arch:             75 86 89 120
    NVIDIA PTX archs:            75 86 89 120

  OpenCL:                        YES (SVM)
    Include path:                D:/opencv/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load

  Python (for build):            C:/Users/*****/AppData/Local/Microsoft/WindowsApps/python3.exe

  Install to:                    D:/opencv_build2/install
-----------------------------------------------------------------

その他設定したOPENCVのビルドオプション

  • CUDA_FAST_MATH:オン

  • ENABLE_FAST_MATH:オン
    少しでも処理を早くしたいという気持ちでオンにしました。

  • ENABLE_LTO:オン
    Link Time Optimizationで、コンパイル後の最終リンク時にコード全体を最適化するオプションのようです。
    処理が速くなるかもしれないのでオンに。

  • WITH_OPENCL_SVM:オン
    Shared Virtual Memoryで、CPUとGPUのメモリ共用が仮想メモリを通して可能になりCPU-GPUのメモリ転送が速くなるらしいです。RADEONではOPENCLを利用してもらう予定なのでオンに。

  • OPENCV_IPP_MEAN:オン

  • OPENCV_IPP_MINMAX:オン

  • OPENCV_IPP_SUM:オン
    CUDA、OPENCLで未対応なものはCPU処理になるので、少しでも速くしたい気持ちでオンに。

ビルドしたopencv4130.dllをにアプリに適用する!

アプリに適用して実行してみるとこんなエラーが出たりして、ほげー?ってなりました。
他の内容(他のdll)でも出たりしますが、Windowsの基本コンポーネントぽいdllで内部例外エラーとなります。
image.png
リンク先がないので内部例外エラーということらしく、cuda toolkitで必要なdllをプロジェクトに正しくコピーできてなかったため発生しました(npp*.dllとかcublas*.dllとかが参照できなくなってた)
DependenciesGuiとかで必要なDLLを確認するのがお勧めです。

まとめ

  • WindowsのOPENCVで、IPP、TBBの両方を有効にしようと思ったら自分でダウンロードして導入する必要がありそうだよ!
  • IPPだけだったらcmakeの時に自動でダウンロードしてくれるよ!
  • OPENCL、CUDAは桁違いに速いので、超お勧め!
  • OPENCVをビルドする時、特にcmake_guiの人はCPUの設定に注意しようね!
  • CUDA入れたなら、cudatoolkitのdllをコピーしてくるのも忘れずに。
  • 公式で配布されているビルド済みのOPENCVはいい感じに速いので、CUDA使いたいとかじゃなかったらお勧めです!
  • オレはようやくのぼりはじめたばかりだからな
    このはてしなく遠いOPENCV Build坂をよ・・・
                        未完
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?