opencv gpuKnnMatch

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;
}
發佈了33 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章