Реализация OpenCV ORB GPU медленнее, чем CPU

Я пытаюсь запустить алгоритм ORB OpenCV для кадров видео, и я заметил, что версия процессора работает намного быстрее, чем версия GPU. Вот код:

#include <iostream>
#include "opencv2/core/core.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/gpu/gpu.hpp"#include <fstream>
#include <sstream>
#include <math.h>
#include <omp.h>

#include <algorithm>
#include <vector>
#include <string>

using namespace cv;
using namespace std;
using namespace cv::gpu;

void process_cpu(string vid, int start_frame, int end_frame)
{
VideoCapture myCapture(vid);
Mat frame, gray_frame;
ORB myOrb(400);
Mat descriptors;
vector<KeyPoint> keypoints;

myCapture.set(CV_CAP_PROP_POS_FRAMES, start_frame);

for (int i=0; i<end_frame-start_frame; i++) {
myCapture.read(frame);
cvtColor(frame, gray_frame, CV_RGB2GRAY);
myOrb(gray_frame, Mat(), keypoints, descriptors);
}
myCapture.release();
}

void process_gpu(string vid, int start_frame, int end_frame)
{
VideoCapture myCapture(vid);
Mat frame, gray_frame;
GpuMat gpu_frame;
ORB_GPU myOrb(400);
GpuMat keypoints, descriptors;

myCapture.set(CV_CAP_PROP_POS_FRAMES, start_frame);

for (int i=0; i<end_frame-start_frame; i++) {
myCapture.read(frame);
cvtColor(frame, gray_frame, CV_RGB2GRAY);
gpu_frame.upload(gray_frame);
myOrb.blurForDescriptor = true;
myOrb(gpu_frame, GpuMat(), keypoints, descriptors);
}
myCapture.release();
}

int main (int argc, char* argv[])
{
int n = 4;
VideoCapture myCapture(argv[1]);
double frameNumber = myCapture.get(CV_CAP_PROP_FRAME_COUNT);
myCapture.release();

double TimeStart = 0;
double TotalTime = 0;
TimeStart = (double)getTickCount();

process_gpu(argv[1], 0, frameNumber);

TotalTime = (double)getTickCount() - TimeStart;
TotalTime = TotalTime / getTickFrequency();
cout << "Gpu Time : " << TotalTime << endl;

TimeStart = (double)getTickCount();

process_cpu(argv[1], 0, frameNumber);

TotalTime = (double)getTickCount() - TimeStart;
TotalTime = TotalTime / getTickFrequency();
cout << "Cpu Time : " << TotalTime << endl;

return -1;
}

После запуска этого видео с разрешением 3000 кадров и разрешением 720х480 время работы графического процессора составляет 54 секунды, а время процессора — 24 секунды. Я получаю похожие результаты с другими видео (не HD).
Спецификации ПК:

  • i7-4770K CPU 3,50 ГГц

  • NVIDIA GeForce GTX 650

  • 16 ГБ ОЗУ

Другие алгоритмы обнаружения / описания функций, такие как SURF, работают быстрее с реализацией графического процессора на моей машине.

Кто-нибудь сравнивал две реализации ORB на своей машине?

5

Решение

Взято из эта почта:

cv::ORB применяет GaussianBlur (около 20 строк от конца
orb.cpp) перед вычислением дескрипторов. Там нет никакого способа контролировать это
через публичный интерфейс.

cv::gpu::ORB_GPU имеет публичный член bool blurForDescriptor, который
по умолчанию конструируется как false, Когда я устанавливаю вместо этого значение true, я
найти, что минимальное / среднее / максимальное расстояние Хэмминга падает до 0 / 7,2 / 30 бит, что
кажется гораздо более разумным.

4

Другие решения


По вопросам рекламы [email protected]