Я пытаюсь найти самый быстрый способ сопоставления шаблонов.
Я был удивлен, увидев, что 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
Сопоставление шаблонов OpenCV — OpenCL с внешним графическим процессором медленнее, чем рендеринг процессора ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Совместное использование констант между процессором и графическим процессором в CUDA
Anonymous » » в форуме C++ - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Совместное использование констант между процессором и графическим процессором в CUDA
Anonymous » » в форуме C++ - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Совместное использование констант между процессором и графическим процессором в CUDA
Anonymous » » в форуме C++ - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-