Использование CPU / GPU при использовании Stitching () в OpenCV и OpenCL - PullRequest
0 голосов
/ 11 февраля 2019

Характеристики: Visual Studio 2017;OpenCV 3.4

Я пытаюсь запустить алгоритм сшивания OpenCV на графическом процессоре моего компьютера.Для этого я использую библиотеку OpenCL, которая включена в прозрачный API в OpenCV (https://www.learnopencv.com/opencv-transparent-api/).

. Я наблюдаю за своей активностью графического процессора и процессора с помощью MSI Afterburner, который дает разную статистику о графическом процессоре иЗагрузка ЦП (как показано на скриншотах ниже).

Даже когда мои переменные объявляются с использованием переменных графического процессора, мой код по-прежнему работает на ЦП:

загрузка ЦП один развызывается алгоритм сшивания, загрузка процессора достигает 100%.

использование графического процессора

пока графический процессор не используется.

мой исходный коднаписано ниже:

#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\core\utility.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\stitching.hpp>
#include <opencv2\core\mat.hpp>
#include <opencv2\core\ocl.hpp>

using namespace cv;
using namespace std;

//GLOBAL VARIABLES
bool try_use_gpu = true;
int main()
{
    //Test if OpenCL is usable on this computer
    if (!cv::ocl::haveOpenCL())
    {
        cout << "OPEN_CL NOT AVAILABLE OR NOT LOADED" << endl;
        return -1;
    }
    cout << "OPENCL AVAILABLE" << endl;

    cv::ocl::Context ctx = cv::ocl::Context::getDefault();
    if (!ctx.ptr())
    {
        cerr << "OpenCL is not available" << endl;
        return -1;
    }

    cv::ocl::Device device = cv::ocl::Device::getDefault();
    if (!device.compilerAvailable())
    {
        cerr << "OpenCL compiler is not available" << endl;
        return -1;
    }

    vector<String> filenames;
    String folder = "C:/../Img_Proc_Stitching/Dataset/";
    cout << "start globing" << endl;
    glob(folder, filenames);
    cout << "globing ended" << endl;

    if (filenames.empty())
        return -1;
    UMat u_img;
    vector<UMat> u_img_vector;
    for (size_t i = 0; i < filenames.size(); i++)
    {
        u_img = imread(filenames[i], CV_LOAD_IMAGE_ANYCOLOR).getUMat(ACCESS_READ);
        cout << filenames[i] << endl;
        if (u_img.empty())
        {
            cout << "ERROR READING SRC" << endl;
            return -1;
        }
        else
        {
            cout << "SRC " << i << " resize" << endl;
            resize(u_img, u_img, Size(), 0.3, 0.3, INTER_AREA);
            cout << "SRC -> U_SRC" << endl;
            cout << "U_SRC -> vector_IMG" << endl;
            u_img_vector.push_back(u_img);
            u_img.release();
        }
    }

    UMat u_map;
    cout << "create stitcher " << endl;
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
    stitcher.Stitcher::setWarper(new PlaneWarper);
    stitcher.Stitcher::setFeaturesFinder(new detail::OrbFeaturesFinder());
    cout << "call stitcher" << endl;
    stitcher.Stitcher::stitch(u_img_vector, u_map);
    cout << "Stitcher finished" << endl;

    if (!stitcher.Stitcher::Status::OK)
    {
        cout << "Can't stitch images" << endl;
        return EXIT_FAILURE;
    }
    cout << "Stitcher status checked" << endl;
    Mat map = u_map.getMat(ACCESS_READ);
    imwrite("C:/Users/aterrier/Desktop/OpenCVRoot/Img_Proc/Final_Map.jpg", map);
    cout << "Map written" << endl;

    // EOF
    cv::waitKey(100000);
    return 0;
}

Я рассмотрел примеры OpenCV (https://github.com/opencv/opencv/tree/master/samples/tapi) того, как использовать прозрачный API для выполнения кода в GPU вместо CPU, но я не смог найти, чтоЯ сделал не так.

...