opencv gpuKnnMatch

来源:互联网 发布:jade 知乎 编辑:程序博客网 时间:2024/05/16 19:21

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;}
0 0