我運行下面這段代碼快速檢測儀: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