我运行下面这段代码快速检测仪:OpenCV的GPU上
cv::Ptr<cv::FastFeatureDetector> fastDetector = cv::FastFeatureDetector::create(100, true, 2);
cv::Ptr<cv::cuda::FastFeatureDetector> gpuFastDetector = cv::cuda::FastFeatureDetector::create(100, true, 2);
std::vector<cv::KeyPoint> keypoints;
std::vector<cv::KeyPoint> gpuKeypoints;
cv::Mat frame;
cv::cuda::GpuMat gFrame;
frame = cv::imread("image1.jpg"); // 4608 x 3456
cv::cvtColor(frame, frame, CV_BGR2GRAY);
gFrame.upload(frame);
gpuFastDetector->detect(gFrame, gpuKeypoints);
std::cout << "FAST GPU " << gpuKeypoints.size() << std::endl;
fastDetector->detect(frame, keypoints);
std::cout << "FAST " << keypoints.size() << std::endl;
,输出是:
FAST GPU 2210
FAST 3209
问题1
为什么同样的算法应用于具有相同参数的相同图像会导致检测到不同数量的关键点?
问题2
我在Windows在Visual Studio中运行此。当使用调试配置时,GPU检测执行速度更快。
但是,当使用版本时,正常(CPU)快速检测器执行得更快。此外,无论使用何种配置类型,GPU上的探测器性能都保持不变。但是,与Debug配置相比,在Release下执行检测时,CPU的性能急剧增加。
(我不是在我这里介绍的代码运行的测量结果。我知道一些OpenCV函数的第一个电话需要更长的时间,因为上下文初始化的执行。)
这很可能与我旧question about the FAST detector。 BHawk对CPU的SIMD优化给出了一个合理的解释。
所以,第二个问题是:
是否有可能在SIMD优化的CPU可以比GPU更快地执行FAST特征检测?这似乎不太可能。
对我来说,看起来很明智的是,如果我给它一大块工作嚼碎,GPU将显示其优势。我认为如果数据很大,花在数据处理上的时间花在数据处理上的时间花费在数据处理上花费的时间比就会减少。 图像数据传输速度慢于处理速度似乎不合理。而且,据我所知,这是你暗示GPU给予更小的图像时会超越CPU。 – ancajic