Я пытаюсь запустить алгоритм 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
Другие алгоритмы обнаружения / описания функций, такие как SURF, работают быстрее с реализацией графического процессора на моей машине.
Кто-нибудь сравнивал две реализации ORB на своей машине?
Взято из эта почта:
cv::ORB
применяет GaussianBlur (около 20 строк от конца
orb.cpp) перед вычислением дескрипторов. Там нет никакого способа контролировать это
через публичный интерфейс.
cv::gpu::ORB_GPU
имеет публичный член boolblurForDescriptor
, который
по умолчанию конструируется какfalse
, Когда я устанавливаю вместо этого значение true, я
найти, что минимальное / среднее / максимальное расстояние Хэмминга падает до 0 / 7,2 / 30 бит, что
кажется гораздо более разумным.