OpenCV ORB GPU的实现速度比CPU慢
OpenCV ORB GPU implementation slower than CPU
我试图将ORB OpenCV算法运行到视频的帧,我注意到CPU版本的执行速度比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 CPU 3.50 GHz
NVIDIA GeForce GTX 650
- 16 gb内存
其他特征检测/描述算法,如SURF,在我的机器上使用GPU实现时会执行得更快。
有人在他的机器上比较过ORB的两种实现吗?
摘自本文:
cv::ORB
应用高斯模糊(大约20行)在计算描述符之前。这是无法控制的通过公共接口。
cv::gpu::ORB_GPU
有一个public成员boolblurForDescriptor
默认构造为false
。当我把它设为true时,我发现最小/平均/最大汉明距离下降到0/7.2/30位,其中似乎更合理。
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何获得CPU当前速度,就像Taskmgr中的价值外交一样?下图
- 代码执行/CPU 速度每 2 秒减慢一次
- 我的OpenCL测试的运行速度不超过CPU
- 测量CPU时钟速度
- 在现代CPU上,整数乘法的速度真的和加法的速度一样吗
- 内存围栏降低了所有CPU核心的速度
- C libcurl,限制下载速度-cpu使用率达到100%
- OpenCV ORB GPU的实现速度比CPU慢
- OpenCV CUDA运行速度比OpenCV CPU慢
- 提振.计算速度比普通CPU慢
- 为什么设置 CPU 关联会使线程运行速度变慢
- 与CPU版本相比,OpenCV GPU对象检测速度慢,检测次数少
- OpenCL示例程序在CPU上的执行速度是在GPU上的10倍