Сопоставление шаблонов OpenCV — OpenCL с внешним графическим процессором медленнее, чем рендеринг процессораC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Сопоставление шаблонов OpenCV — OpenCL с внешним графическим процессором медленнее, чем рендеринг процессора

Сообщение Anonymous »

Я пытаюсь найти самый быстрый способ сопоставления шаблонов.
Я был удивлен, увидев, что OpenCL намного медленнее, чем рендеринг CPU и CUDA.
Обычно я бы использовал CUDA, но я жду новую карту AMD GPU, поэтому мне приходится использовать OpenCL.
Последние результаты синхронизации:



Этап
Длительность (в мс)




ЦП
293,00


ГП
268,00


GPU OpenCL
539,00


Я что-то забыл или OpenCL не оптимизирован для моей текущей Nvidia Quadro K620?
cv::Mat img = cv::imread("path-to-source-img");
std::vector templates;
std::vector templatePaths = {"path/template1","path/template2"};
cv::Mat template_img = cv::imread("path/template1");

void loadTemplates() {
for (const auto& path : templatePaths) {
templates.push_back(cv::imread(path));
}
}

void cpu() {
START_TIMER
cv::Mat imgCopy = img.clone();
std::vector futures;

auto matchTemplate = [](const cv::Mat& img, const cv::Mat& templ) {
cv::Mat result;
cv::matchTemplate(img, templ, result, cv::TM_CCOEFF_NORMED);
cv::Point maxLocPoint;
cv::minMaxLoc(result, 0, 0, 0, &maxLocPoint);
return maxLocPoint;
};

// Create a future for each template
for (const auto& templ : templates) {
futures.push_back(std::async(std::launch::async, matchTemplate, img, templ));
}

// Collect results and draw rectangles
for (size_t i = 0; i < templates.size(); ++i) {
cv::Point maxLocPoint = futures.get();
cv::Scalar color(0, 255 * (i + 1) / templates.size(), 255 * (templates.size() - i) / templates.size());
cv::rectangle(imgCopy, cv::Rect(maxLocPoint, cv::Point(maxLocPoint.x + templates.cols, maxLocPoint.y + templates.rows)), color, 2);
}

END_TIMER(cpuMatching)
cv::imshow("Result CPU Optimized", imgCopy);
cv::waitKey(0);
}

void gpu() {
START_TIMER
cv::cuda::GpuMat srcGpu(img);
std::vector templatesGpu;
std::vector resultsGpu(templates.size());
std::vector streams(templates.size());

cv::Ptr matcher = cv::cuda::createTemplateMatching(img.type(), cv::TM_CCOEFF_NORMED);

// Upload templates to GPU and launch matching operations
for (size_t i = 0; i < templates.size(); ++i) {
templatesGpu.emplace_back(templates);
matcher->match(srcGpu, templatesGpu.back(), resultsGpu, streams);
}

// Process results
std::vector maxLocPoints(templates.size());
for (size_t i = 0; i < templates.size(); ++i) {
cv::Mat result;
resultsGpu.download(result, streams);

streams.waitForCompletion();
cv::minMaxLoc(result, nullptr, nullptr, nullptr, &maxLocPoints);
}

END_TIMER(gpuMatching)

cv::Mat imgCopy = img.clone();
for (size_t i = 0; i < templates.size(); ++i) {
cv::Scalar color(0, 255 * (i + 1) / templates.size(), 255 * (templates.size() - i) / templates.size());
cv::rectangle(imgCopy, cv::Rect(maxLocPoints[i], templates[i].size()), color, 2);
}

cv::imshow("Result GPU Stream Optimized", imgCopy);
cv::waitKey(0);
}

// Not yet implemented to work with several templates like cpu and cuda
void gpuOpenCL() {
START_TIMER
// Enable OpenCL
cv::ocl::setUseOpenCL(true);

if (!cv::ocl::haveOpenCL()) {
std::cout

Подробнее здесь: https://stackoverflow.com/questions/789 ... -rendering
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»