графическая библиотека быстрей чем opencv
От: sergey2b ЮАР  
Дата: 26.03.22 15:39
Оценка:
подскажите пожалуйста есть ли графические библиотеки быстрей чем opencv для операций
ресайзинга изображений
совмещения нескольких изображений
изменения кодировки цветов


у меня сейчас CPU грузиться на 100%
насколько я смог разобраться в opencv использование GPU от Intel работает только для кодирования декодирования видео
есть флаг использовать CUDA для математических вычеслений, но у меня ограничение использовать только оборудование от Intel
Отредактировано 26.03.2022 15:52 sergey2b . Предыдущая версия .
Re: графическая библиотека быстрей чем opencv
От: Serpuh фотомер.рф
Дата: 26.03.22 15:49
Оценка: 9 (1)
Здравствуйте, sergey2b, Вы писали:
S>подскажите пожалуйста есть ли графияеские библиотеки быстрей чем opencv для операций
S>ресайзинга изображений

Собрать OpenCV с флагом WITH_OPENMP, по дефолту он выключен. Или вручную по потокам распараллелить.
Re: графическая библиотека быстрей чем opencv
От: kov_serg Россия  
Дата: 26.03.22 16:05
Оценка: 9 (1)
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста есть ли графические библиотеки быстрей чем opencv для операций

S>ресайзинга изображений
https://habr.com/ru/post/301576/ https://uploadcare.com/blog/the-fastest-production-ready-image-resize/
S>совмещения нескольких изображений
S>изменения кодировки цветов

S>у меня сейчас CPU грузиться на 100%

это же просто замечательно, значит вы загружаете все ресурсы

S>насколько я смог разобраться в opencv использование GPU от Intel работает только для кодирования декодирования видео

S>есть флаг использовать CUDA для математических вычеслений, но у меня ограничение использовать только оборудование от Intel
CUDA может только nvidia, остальные OpenCL либо metal
А что у вас за оборудование? И какой производительности вы хотите достичь?
Re: графическая библиотека быстрей чем opencv
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 26.03.22 16:16
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>у меня сейчас CPU грузиться на 100%

S>насколько я смог разобраться в opencv использование GPU от Intel работает только для кодирования декодирования видео

На Интела она вполне хороша. Два нюанса:
1. При работе на CPU убедиться, что собрана с IPP и использует его.
2. Используй OpenCL (это называется TAPI, задействуется через cv::UMat) на Интеловской GPU.
Re: графическая библиотека быстрей чем opencv
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 26.03.22 16:42
Оценка: 9 (1)
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста есть ли графические библиотеки быстрей чем opencv для операций

S>ресайзинга изображений
S>совмещения нескольких изображений
S>изменения кодировки цветов

S>у меня сейчас CPU грузиться на 100%

S>насколько я смог разобраться в opencv использование GPU от Intel работает только для кодирования декодирования видео
S>есть флаг использовать CUDA для математических вычеслений, но у меня ограничение использовать только оборудование от Intel

Vips популярная альтернатива.
Ce n'est que pour vous dire ce que je vous dis.
Re: графическая библиотека быстрей чем opencv
От: Константин Черногория  
Дата: 27.03.22 18:57
Оценка: 9 (1)
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста есть ли графические библиотеки быстрей чем opencv

Если на Windows, бери Direct3D 11, он в коробке с ОС.
Основных минусов два, с ним удобно работать только на C++, и если раньше не имел дел с аппаратной 3D графикой, уйдёт заметное время на обучение.

S>ресайзинга изображений

Если увеличивать, или аппаратный bilinear sampler (быстрее и проще), или напиши на HLSL pixel или compute shader, который сделает bicubic (лучше качество).
Если уменьшать, генерируй пирамиду mip levels методом ID3D11DeviceContext::GenerateMips, потом trilinear sampler.
S>совмещения нескольких изображений
Рендерить затекстуренные прямоугольники довольно дёшево.
S>изменения кодировки цветов
Проще всего compute shader по 1 потоку на пиксель. Или если кодировка вроде NV12, можно compute shader по 1 потоку на 4 пикселя.
Re[2]: графическая библиотека быстрей чем opencv
От: sergey2b ЮАР  
Дата: 28.03.22 14:08
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>На Интела она вполне хороша. Два нюанса:

N>1. При работе на CPU убедиться, что собрана с IPP и использует его.
N>2. Используй OpenCL (это называется TAPI, задействуется через cv::UMat) на Интеловской GPU.

я пересобрад opencv с IPP сапорт
вы можете посмотреть это инфо сборки


General configuration for OpenCV 4.5.5 =====================================
  Version control:               unknown

  Platform:
    Timestamp:                   2022-03-28T02:48:52Z
    Host:                        Windows 10.0.19043 AMD64
    CMake:                       3.22.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 (18 files):         + SSSE3 SSE4_1
      SSE4_2 (2 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
      FP16 (1 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
      AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
      AVX2 (33 files):           + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
      AVX512_SKX (8 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.30137.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 /MP -openmp  /MD /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 /MP -openmp  /MDd /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 -openmp   /MD /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 -openmp /MDd /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 ts video videoio world
    Disabled:                    -
    Disabled by dependency:      -
    Unavailable:                 java python2 python3
    Applications:                tests perf_tests 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.2.11)
    JPEG:                        build-libjpeg-turbo (ver 2.1.2-62)
    WEBP:                        build (ver encoder: 0x020f)
    PNG:                         build (ver 1.6.37)
    TIFF:                        build (ver 42 - 4.2.0)
    JPEG 2000:                   build (ver 2.4.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
    Intel Media SDK:             YES (C:/Program Files (x86)/IntelSWTools/Intel(R) Media SDK 2021 R1/Software Development Kit/lib/x64/libmfx_vs2015.lib)

  Parallel framework:            OpenMP

  Trace:                         YES (with Intel ITT)

  Other third-party libraries:
    Intel IPP:                   2020.0.0 Gold [2020.0.0]
           at:                   C:/opencv-4.5.5/build/3rdparty/ippicv/ippicv_win/icv
    Intel IPP IW:                sources (2020.0.0)
              at:                C:/opencv-4.5.5/build/3rdparty/ippicv/ippicv_win/iw
    Lapack:                      NO
    Eigen:                       NO
    Custom HAL:                  NO
    Protobuf:                    build (3.19.1)

  OpenCL:                        YES (NVD3D11)
    Include path:                C:/opencv-4.5.5/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load

  Python (for build):            C:/Program Files/Python310/python.exe

  Java:
    ant:                         NO
    JNI:                         NO
    Java wrappers:               NO
    Java tests:                  NO

  Install to:                    C:/opencv-4.5.5/build/install
-----------------------------------------------------------------


это тестовый код


// Include Libraries
#include "opencv2/core.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

#ifdef _WIN64
#if _DEBUG
//#pragma comment(lib, "opencv_world454d.lib")
#pragma comment(lib, "opencv_world455.lib")
#else
#pragma comment(lib, "opencv_world455.lib")
#endif
#endif

// Namespace to nullify use of cv::function(); syntax
using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    char* filename = argv[1];

    if (!filename) return -1;


    string sret = cv::getBuildInformation();
    cout << sret << endl;

    ocl::setUseOpenCL(true);

    bool oclhaveOpenCL = ocl::haveOpenCL();
    bool ocluseOpenCL = ocl::useOpenCL();

    std::cout << oclhaveOpenCL << " " << ocluseOpenCL << std::endl;

    // initialize a video capture object
    //VideoCapture video1(filename, cv::CAP_INTEL_MFX);
    VideoCapture video1(filename);

    // Print error message if the stream is invalid
    if (!video1.isOpened())
    {
        cout << "Error opening video stream or file" << endl;
    }
    else
    {
        // Obtain fps and frame count by get() method and print
        // You can replace 5 with CAP_PROP_FPS as well, they are enumerations
        int fps = video1.get(5);
        cout << "Frames per second :" << fps;

        // Obtain frame_count using opencv built in frame count reading method
        // You can replace 7 with CAP_PROP_FRAME_COUNT as well, they are enumerations
        int frame_count = video1.get(7);
        cout << "  Frame count :" << frame_count;
    }


    // Read the frames to the last frame
    while (video1.isOpened())
    {
        // Initialise frame matrix
        cv::UMat frame1;

        // Initialize a boolean to check if frames are there or not
        bool isSuccess = video1.read(frame1);

        // If frames are present, show it
        if (isSuccess == true)
        {
            // Load 4 images from the disk
            cv::UMat img1 = frame1;
            cv::UMat img2 = frame1;
            cv::UMat img3 = frame1;
            cv::UMat img4 = frame1;

            // Make sure they have been loaded successfully
            if (img1.empty() || img2.empty() || img3.empty() || img4.empty())
            {
                std::cout << "!!! Failed to load one of the images\n";
                return -1;
            }

            /* Make sure they are compatible: same type, depth and # channels */

            if ((img1.type() != img2.type()) ||
                (img3.type() != img4.type()) ||
                (img1.type() != img4.type()))
            {
                std::cout << "!!! The depth doesn't match!\n";
                return -1;
            }

            if ((img1.depth() != img2.depth()) ||
                (img3.depth() != img4.depth()) ||
                (img1.depth() != img4.depth()))
            {
                std::cout << "!!! The depth doesn't match!\n";
                return -1;
            }

            if ((img1.channels() != img2.channels()) ||
                (img3.channels() != img4.channels()) ||
                (img1.channels() != img4.channels()))
            {
                std::cout << "!!! Number of channels doesn't match!\n";
                return -1;
            }

            // Create the destination image based on the size of the loaded images
            //  _________
            // |    |    |
            // |_1__|_2__|
            // |    |    |
            // |_3__|_4__|

            /* As the input images might have different sizes, we need to make sure
             * to create an output image that is big enough to store all of them.
             */

             // Compute the width of the output image
            int row1_size = img1.size().width + img2.size().width;
            int row2_size = img3.size().width + img4.size().width;
            int new_width = std::max(row1_size, row2_size);

            // Compute the height of the output image
            int col1_size = img1.size().height + img3.size().height;
            int col2_size = img2.size().height + img4.size().height;
            int new_height = std::max(col1_size, col2_size);

            // Create the destination image
            cv::UMat dst_img(cv::Size(new_width, new_height), img1.type(), cv::Scalar(0, 0, 0));
            std::cout << "dst: size " << dst_img.size().width << "x" << dst_img.size().height << std::endl;

            /* Copy the pixels of the input images to the destination */

            //  _________
            // |    |    |
            // |_1__|    |
            // |         |
            // |_________|
            img1.copyTo(dst_img(cv::Rect(0, 0, img1.cols, img1.rows)));

            //  _________
            // |    |    |
            // |_1__|_2__|
            // |         |
            // |_________|    
            img2.copyTo(dst_img(cv::Rect(img1.size().width, 0, img2.cols, img2.rows)));

            //  _________
            // |    |    |
            // |_1__|_2__|
            // |    |    |
            // |_3__|____|    
            img3.copyTo(dst_img(cv::Rect(0,
                std::max(img1.size().height, img2.size().height),
                img3.cols,
                img3.rows)));

            //  _________
            // |    |    |
            // |_1__|_2__|
            // |    |    |
            // |_3__|_4__|    
            img4.copyTo(dst_img(cv::Rect(img3.size().width,
                std::max(img1.size().height, img2.size().height),
                img4.cols,
                img4.rows)));

            // For testing purposes, display it on the screen
            cv::imshow("Test", dst_img);
            cv::waitKey(1);
        }

        // If frames are not there, close it
        if (isSuccess == false)
        {
            cout << "Video camera is disconnected" << endl;
            break;
        }

    }
    // Release the video capture object
    video1.release();
    destroyAllWindows();
    return 0;
}


если использовать VideoCapture video1(filename, cv::CAP_INTEL_MFX); то я вижу как нагржуаеться intel GPU

но я не вижу как UMat используют GPU
но я не вижу в таскменеджере что GPU от Intel используеться хотя бы на 1%
Отредактировано 28.03.2022 18:03 sergey2b . Предыдущая версия .
Re[3]: графическая библиотека быстрей чем opencv
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 29.03.22 18:52
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>я пересобрад opencv с IPP сапорт

S>вы можете посмотреть это инфо сборки

Ага, раз с ним соббрано, значит и используется. Единственно, что там и использовать особо негде — просто копирование кадров.


S>это тестовый код


А что он выводит? OpenCL используется или нет? Кроме того, можно указывать OpenCL device, на котором должно выполняться, а также выводить список этих самых устройств.
Ну и замечание по коду. Все cv::Mat и cv::UMat надо определять вне цикла. Даже временные Mat надо переиспользовать, делать их членами класса, например. Дело в том, что OpenCV заново не будет выделять память под такие объекты, если они его устраивают. Так что большую картинку уж точно не надо объявлять внутри. Если же мы говорим про UMat, то это вообще безумие — так обращаться с видеопамятью.
Re[4]: графическая библиотека быстрей чем opencv
От: sergey2b ЮАР  
Дата: 29.03.22 20:09
Оценка:
Здравствуйте, Nuzhny, Вы писали:


N>А что он выводит? OpenCL используется или нет? Кроме того, можно указывать OpenCL device, на котором должно выполняться, а также выводить список этих самых устройств.

N>Ну и замечание по коду. Все cv::Mat и cv::UMat надо определять вне цикла. Даже временные Mat надо переиспользовать, делать их членами класса, например. Дело в том, что OpenCV заново не будет выделять память под такие объекты, если они его устраивают. Так что большую картинку уж точно не надо объявлять внутри. Если же мы говорим про UMat, то это вообще безумие — так обращаться с видеопамятью.

спасибо за советы, все заработал
в реальном коде я создаю объекты в начале функции


вот пример в котором при замене Mat на UMat видна разница в производительности

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/ocl.hpp>

#include <iostream>
#include <chrono>

#ifdef _WIN64
#if _DEBUG
#pragma comment(lib, "opencv_world454d.lib")
#else
//#pragma comment(lib, "opencv_world454.lib")
#pragma comment(lib, "opencv_world455.lib")
#endif
#endif


using namespace std;
using namespace cv;

int main()
{
    cout << "Have OpenCL?: " << cv::ocl::haveOpenCL() << endl; // returns true, OCL available
    ocl::setUseOpenCL(true);
    //ocl::setUseOpenCL(false);

    //cv::ocl::Context context((1 << 2));
    cv::ocl::Context context;
    if (!context.create(cv::ocl::Device::TYPE_GPU))
    {
        cout << "Failed creating the context..." << endl;
        return 0;
    }
    cout << context.ndevices() << " GPU devices are detected." << endl;
    for (int i = 0; i < context.ndevices(); i++)
    {
        cv::ocl::Device device = context.device(i);
        cout << "name                 : " << device.name() << endl;
        cout << "available            : " << device.available() << endl;
        cout << "imageSupport         : " << device.imageSupport() << endl;
        cout << "OpenCL_C_Version     : " << device.OpenCL_C_Version() << endl;
        cout << endl;
    }

    // Load images test1.jpg, ..., test7.jpg
    vector<UMat> images;
    for (int i = 1; i <= 7; i++)
    {
        string filename = "c:\\tmp\\test" + to_string(i) + ".jpg";
        UMat input = imread(filename).getUMat(ACCESS_READ);
        images.push_back(input);
    }

    for (int i = 0; i < 7; i++)
    {
        chrono::high_resolution_clock::time_point begin = chrono::high_resolution_clock::now();

        // ---------------------- Critical section --------------------------
        UMat result;
        //bilateralFilter(images.at(i), result, 0, 10, 3);
        bilateralFilter(images.at(i), result, 0, i * 10, 3);
#if 0
        UMat result;
        if (i == 0)
            cv::Sobel(images.at(i), result, CV_32F, 1, 0, 5);
        else if (i == 1)
            cv::Sobel(images.at(i), result, CV_32F, 0, 1, 5);
        else
            cv::Sobel(images.at(i), result, CV_32F, 1, 1, 5);
#endif
        // ------------------------------------------------------------------

        chrono::high_resolution_clock::time_point end = chrono::high_resolution_clock::now();
        long long ms = chrono::duration_cast<chrono::milliseconds>(end - begin).count();
        cout << ms << " ms" << endl;
    }
}
Re: графическая библиотека быстрей чем opencv
От: Patalog Россия  
Дата: 05.04.22 20:14
Оценка: 12 (1)
Здравствуйте, sergey2b, Вы писали:

[]

S>но у меня ограничение использовать только оборудование от Intel


oneVPL
Почетный кавалер ордена Совка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.