2014-07-17 14 views
5

से ओपनसीवी ओआरबी जीपीयू कार्यान्वयन धीमा है, मैं एक वीडियो के फ्रेम में ओआरबी ओपनसीवी एल्गोरिदम चलाने की कोशिश कर रहा हूं और मैंने देखा कि सीपीयू संस्करण 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 फ्रेम और 720x480 संकल्प के साथ एक वीडियो पर इस चलाने के बाद, GPU के समय 54 सेकंड और CPU समय 24 सेकंड है। मुझे अन्य वीडियो (एचडी नहीं) के साथ समान परिणाम मिलते हैं। पीसी चश्मा:

  • i7-4770K सीपीयू 3.50 गीगा

  • NVIDIA GeForce GTX 650

  • 16 जीबी रैम

अन्य सुविधा के सर्फ की तरह का पता लगाने/विवरण एल्गोरिदम तेजी के साथ प्रदर्शन मेरी मशीन पर जीपीयू कार्यान्वयन।

क्या किसी ने अपनी मशीन पर ओआरबी के दो कार्यान्वयन की तुलना की है?

उत्तर

4

this post से लिया:

cv::ORB कंप्यूटिंग वर्णनकर्ता से पहले एक GaussianBlur ( orb.cpp के अंत से लगभग 20 लाइनें) लागू होता है। सार्वजनिक इंटरफ़ेस के माध्यम से इस को नियंत्रित करने का कोई तरीका नहीं है।

cv::gpu::ORB_GPU में सार्वजनिक सदस्य बूल blurForDescriptor है, जो डिफ़ॉल्ट रूप से false के रूप में बना है। जब मैं इसे सही करने के बजाय सेट करता हूं, तो मैं पाते हैं कि न्यूनतम/औसत/अधिकतम हथौड़ा दूरी 0/7.2/30 बिट्स तक गिर जाती है, जो अधिक उचित लगता है।

संबंधित मुद्दे