Introduction

I am going to measure the performence of my two GT650M and compare GPU with CPU version.

code segments

#include <iostream>
#include <omp.h>
using namespace std;

#include <cuda_runtime.h>

#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>
using namespace cv;

#define TB__(A) int64 A; A = cv::getTickCount()
#define TE__(A) cout << #A << " : " << 1.E3 * double(cv::getTickCount() - A)/double(cv::getTickFrequency()) << "ms" << endl

Vec3b max(cv::Mat &A, cv::Mat &B){
    int width = A.cols;
    int height = A.rows;
    Vec3b me(0,0,0);
    for (int y = 0; y < height; y++){
        for (int x = 0; x < width; x++){
            Vec3b p0 = A.at<Vec3b>(y,x);
            Vec3b p1 = B.at<Vec3b>(y,x);
            Vec3b pixel;
            pixel[0] = p1[0]>p0[0]? p1[0]-p0[0]:p0[0]-p1[0];
            pixel[1] = p1[1]>p0[1]? p1[1]-p0[1]:p0[1]-p1[1];
            pixel[2] = p1[2]>p0[2]? p1[2]-p0[2]:p0[2]-p1[2];
            if (me[0] < pixel[0])
                me[0] = pixel[0];
            if (me[1] < pixel[1])
                me[1] = pixel[1];
            if (me[2] < pixel[2])
                me[2] = pixel[2];
        }
    }
    return me;
}

#define REPEATES 10000

int main(){
  // please ensure that you have at least two Nvidia GPUs on your mathorboad.
    cv::Mat cpu_src = imread("86.jpg");
    cv::Mat cpu_dst;

    cv::Mat gpu_dst[2];

    TB__(cpu_cvt);
#pragma omp parallel for num_threads(4)
    for (int k = 0; k < REPEATES; k++)
        cv::cvtColor(cpu_src, cpu_dst, CV_BGR2Lab);
    TE__(cpu_cvt);

    TB__(gpu_cvt);
#pragma omp parallel num_threads(2)
    {
        int id = omp_get_thread_num();
        cv::gpu::setDevice(id);

        cv::gpu::GpuMat dev_src;
        cv::gpu::GpuMat dev_dst;

        dev_src.upload(cpu_src);

        //#pragma omp master
        //TB__(gpu_omp_dev);

        #pragma omp for
        for (int k = 0; k < REPEATES; k++){
            dev_src.upload(cpu_src);
            cv::gpu::cvtColor(dev_src, dev_dst, CV_BGR2Lab);
            dev_dst.download(gpu_dst[id]);
        }
        cudaDeviceSynchronize();
    }
    TE__(gpu_cvt);

  cout << cv::sum(cpu_dst - gpu_dst[0]) << endl;
  cout << cv::sum(cpu_dst - gpu_dst[1]) << endl;
  cout << cv::sum(gpu_dst[0] - gpu_dst[1]) << endl;

    cout << endl;

  cout << max(cpu_dst, gpu_dst[0]) << endl;
  cout << max(cpu_dst, gpu_dst[1]) << endl;
    return 0;
}

[OpenCV] GpuMat and Mat, compare cvtColor perforemence的更多相关文章

  1. opencv学习之颜色空间转换cvtColor()

    我们生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图.二值图.HSV.HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能.首先看一下cvtColo ...

  2. OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)

    自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题. 比如: int H ...

  3. OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解

    原文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 Title : cv::Mat depth/dims/channels ...

  4. Visual Studio 控制台应用程序 同时使用OpenCV和matlab mat文件操作

    matalb具有灵活的图像处理,代码编写起来简洁而高效.而OpenCV具有很多成熟的计算机视觉算法,能够处理很多实时的识别处理等问题,而且代码运行起来效率很高.所以如何结合两者之间的优点,是让很多学术 ...

  5. 【编程开发】opencv实现对Mat中某一列或某一行的元素进行normalization

    [编程开发]opencv实现对Mat中某一列或某一行的元素进行normalization 标签: [编程开发] [机器学习] 声明:引用请注明出处http://blog.csdn.net/lg1259 ...

  6. 第二章:Opencv核心類Mat

    Opecv就是做計算機視覺,就是讲图片转换成计算机所能识别的数据 Mat类中由大量的内联函数,主要就是用于提高速度. 一般类型都用rgb,存的时候用CV_8UC3.create函数一般会把原来的空间释 ...

  7. opencv yuv420与Mat互转

    项目用到opencv 融合图片的功能,经过一天的调试,达到预期目标,先将如何调用opencv库实现YUV42与Mat互转记录下来. 一.下载opencv编译的库下载地址是:http://opencv. ...

  8. opencv中的Mat类型

    Mat类型主要是跟matlab中的数据类型一样.故用起来很方便. Mat最大的优势跟STL很相似,都是对内存进行动态的管理,不需要之前用户手动的管理内存,对于一些大型的开发,有时候投入的lpImage ...

  9. OpenCV教程二 - Mat对象与它各种用法

    学习OpenCV大家都会遇到一个对象叫做Mat,此对象非常神奇,支持各种操作.很多初学者因此被搞得头晕脑胀,它各种用法太多太杂,搞得初学者应接不暇,感觉有心无力.无处下手之感.这里我们首先要正本清源, ...

随机推荐

  1. Headless Chrome:服务端渲染JS站点的一个方案【中篇】【翻译】

    接上篇 防止重新渲染 其实说不对客户端代码做任何修改是忽悠人的.在我们的Express 应用中,通过Puppteer加载页面,提供给客户端响应,但是这个过程是有一些问题的. js脚本在服务端的Head ...

  2. [HAOI2006]旅行

    题目描述 Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也 ...

  3. [HNOI2006]公路修建问题

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 复制 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 3 ...

  4. 数轴line

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAq8AAAGaCAYAAAAhPqoeAAAgAElEQVR4nOzdCbh2U/k/8C0NpkgRzZ

  5. 【BZOJ3573】【HNOI2014】米特运输

    Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N,1号城市 ...

  6. jQuery Datetable

    先来个官网可以直接看官网  https://www.datatables.net/manual/data/ 安装 DataTables是一个功能强大的Javascript库,用于为HTML表格添加交互 ...

  7. RHEL 7修改ssh默认端口号

    RHEL7修改默认端口号(默认port22)初次安装系统完毕后默认情况下系统已经启动了sshd服务当然我们也可以先进行检查: 步骤1,检查是否已安装ssh服务 步骤2,检查服务是否已开启 如上图所示显 ...

  8. CMD远程连接服务器上的MySQL

    1.打开CMD命令行. 2.输入mysql -h要远程的IP地址 -u设置的MySQL用户名 -p登录用户密码 例如:mysql -h192.168.0.110 -uroot -p1233 (如果不能 ...

  9. eclipse maven could not resolve archetype之类的错误

    先说下网上有种联网导入的方法 而我的是本地导入的方法 就是导入原型特慢 或者 原型下载都下载不了的问题 解决方法只能 把那个文件下载搞到本地 没有被墙 就是速度慢 http://repo1.maven ...

  10. node之querystring模块

    前言 querystring 模块提供了一些实用工具,用于解析与格式化 URL 查询字符串. 一.querystring.parse() 用于将一个查询字符串解析为JS 对象. const query ...