opencv knnMatch 與 gpuKnnMatch性能比較,不同設備測試效果不同,在我的tesla和i7上測試gpu平均加速3倍。KnnMatch在前面的博文中已有代碼
#include<iostream>
#include<sys/time.h>
#include"opencv2/gpu/gpu.hpp"
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;
using namespace cv::gpu;
const int samples = 50000;
const int DIM = 1024;
const int k = 10;
inline timeval cpu_time(){
timeval t1;
gettimeofday(&t1,NULL);
return t1;
}
inline double cost_time(timeval t1,timeval t2){
double t = 1000*(t2.tv_sec-t1.tv_sec)+(t2.tv_usec-t1.tv_usec)/1000;
return t;
}
void generate_data(Mat& data){
RNG rng((unsigned int)time(NULL));
//generate data randomly
data.create(samples,DIM,CV_32FC1);
Point center;
center.x = rng.uniform(0,data.cols);
center.y = rng.uniform(0, data.rows);
rng.fill(data, RNG::NORMAL, Scalar(center.x,center.y), Scalar(data.cols*0.05,data.rows*0.05));
//cout<<data<<endl;
}
int main(){
//CPU mat
Mat data, query;
generate_data(data);
query = data.row(10).clone();
//copy to GPU
GpuMat g_data, g_query;
g_data.upload(data);
g_query.upload(query);
CV_Assert(!g_data.empty());
CV_Assert(!g_query.empty());
cv::gpu::printShortCudaDeviceInfo(cv::gpu::getDevice());
timeval t1,t2;
t1 = cpu_time();
// match
GpuMat g_trainIdx, g_distance, g_all;
BFMatcher_GPU matcher(NORM_L2);
matcher.knnMatchSingle(g_query, g_data, g_trainIdx,g_distance, g_all, k);
t2 = cpu_time();
cout<<cost_time(t1,t2)<<"ms"<<endl;
//download
Mat trainIdx, distance, all;
g_trainIdx.download(trainIdx);
g_distance.download(distance);
g_all.download(all);
g_query.download(query);
g_data.download(data);
vector<DMatch> matches;
BFMatcher_GPU::matchDownload(g_trainIdx,g_distance,matches);
cout<<trainIdx<<endl;
cout<<distance<<endl;
return 0;
}