windows 源碼編譯 opencv-4.5.4 + tbb + ipp + openmp


1. 下載opencv源碼

  • 官網下載需要版本的opencv源碼

  • 解壓到本地文件夾,進入解壓后的opencv-4.5.4文件夾,新建source文件夾,將解壓的內容放入source文件夾中,新建build文件夾

  • 下載opencv_contrib,並解壓

2. 安裝cmake

3. 安裝Intel oneAPI Base Toolkit

  • Intel將TBB、IPP等加速庫集成到了oneAPI庫中,所以可以直接安裝oneAPI

*按提示安裝,勾選TBB,IPP等庫

4. 安裝Visual Studio 2019

  • 省略

5. 編譯opencv

  • 打開cmake,設置好opencv源碼路徑和build路徑

  • 點擊configure,設置generator

  • configure完成后,設置with tbb

  • 設置with ipp
    IPP的cmake路徑一般為C:/Program Files (x86)/Intel/oneAPI/ipp/2021.4.0/lib/cmake/ipp

  • 設置with openmp

  • 設置 BUILD_opencv_world

  • 點擊Generate,等待完成

  • 在build文件夾中找到Opencv.sln,使用VS打開

  • 選擇Debug模式,右鍵點擊CMakeTargets中的ALL_BUILD,點擊"生成",完成后右鍵點擊INSTALL,然后點擊"生成";

  • 選擇Release模式,重復以上操作

  • 完成后可在文件夾中看到編譯好的opencv

  • 設置環境變量(省略)

6. 速度測試

測試的CPU為8核16線程, 在開滿16個線程后對比測試有加速的OpenCV和沒有加速庫的OpenCV。
測試了以下算子:

cv::cvtColor()
cv::erode()
cv::dilate()
cv::findContours()

代碼如下:

void testSpeed()
{
    cv::Mat image = cv::imread("C:\\Workbench\\Data\\lenna.png");
    cv::Mat cvtImage;
    cv::Mat kernel_1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
    cv::Mat kernel_2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
    float t = 0.0;
    for (int i = 0; i < 100; ++i)
    {   
        auto start_time = std::chrono::high_resolution_clock::now();
        cv::cvtColor(image, cvtImage, cv::COLOR_BGR2GRAY);
        cv::erode(cvtImage, cvtImage, kernel_1, cv::Point(-1, -1), 1);
        cv::dilate(cvtImage, cvtImage, kernel_2, cv::Point(-1, -1), 3);
        std::vector<std::vector<cv::Point>> _contours;
        std::vector<cv::Vec4i> hierarchy;
        cv::findContours(cvtImage, _contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_NONE);
        auto end_time = std::chrono::high_resolution_clock::now();
        auto ms = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time).count();
        t = t + (ms * 1.0 / 1e6);
    }
    std::cout << "time: " << t << std::endl;
}

int main()
{
    std::thread threads[16];
    for (int i = 0; i < 16; ++i)
    {
        threads[i] = std::thread(testSpeed);
    }
    for (auto &t : threads)
    {
        t.join();
    }
    return 0;
}

測試結果:

  • 有TBB加速的OpenCV
[ INFO:0] global C:\Softwares\opencv-4.5.4\source\modules\core\src\parallel\registry_parallel.impl.hpp (96) cv::parallel::ParallelBackendRegistry::ParallelBackendRegistry core(parallel): Enabled backends(2, sorted by priority): TBB(1000); OPENMP(990)
[ INFO:0] global C:\Softwares\opencv-4.5.4\source\modules\core\include\opencv2/core/parallel/backend/parallel_for.tbb.hpp (54) cv::parallel::tbb::ParallelForBackend::ParallelForBackend Initializing TBB parallel backend: TBB_INTERFACE_VERSION=12040
[ INFO:0] global C:\Softwares\opencv-4.5.4\source\modules\core\src\parallel\parallel.cpp (77) cv::parallel::createParallelForAPI core(parallel): using backend: TBB (priority=1000)
time: 0.990235
time: 0.990842
time: 0.994129
time: 0.992949
time: 1.00523
time: 0.995566
time: 1.01266
time: 1.00874
time: 1.02145
time: 1.02373
time: 1.0271
time: 1.03198
time: 1.02038
time: 1.03185
time: 1.03868
time: 1.05034
  • 沒有TBB加速的OpenCV
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\parallel\registry_parallel.impl.hpp (96) cv::parallel::ParallelBackendRegistry::ParallelBackendRegistry core(parallel): Enabled backends(3, sorted by priority): ONETBB(1000); TBB(990); OPENMP(980)
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\Softwares\opencv\build\x64\vc15\bin\opencv_core_parallel_onetbb454_64d.dll => FAILED
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_onetbb454_64d.dll => FAILED
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\Softwares\opencv\build\x64\vc15\bin\opencv_core_parallel_tbb454_64d.dll => FAILED
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_tbb454_64d.dll => FAILED
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\Softwares\opencv\build\x64\vc15\bin\opencv_core_parallel_openmp454_64d.dll => FAILED
[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_openmp454_64d.dll => FAILED
time: 2.38442
time: 2.43082
time: 2.43363
time: 2.42781
time: 2.46706
time: 2.47458
time: 2.48732
time: 2.49592
time: 2.50646
time: 2.51118
time: 2.50738
time: 2.51676
time: 2.50897
time: 2.52977
time: 2.50874
time: 2.55397
  • 結論:在線程資源占滿的情況下,以上算子測得有TBB加速的Opencv比沒有加速的Opencv要快出約2.5倍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM