• GPU上运行的函数又称为Kernel,用__global__修饰
  • 调用Kernel函数时,用FunctionCall<<<block_shape, thread_shape, int>>>(args1, args2, ...)
  • block_shape与thread shape都是一个三维的结构dim(x,y,z), 其中x为横向,y为纵向。变化最快的维度为x,其他为y,最后为z。所以维度为(i,j,k)的thread或block的Index实际上是:k * Dim.x * Dim.y + j * Dim.x +i
  • 每个block中的线程数量有一定的限制,老的GPU通过为512个,较新的GPU则通常有1024个,所以每个block中的线程最好不要超过(32,32)

#include <iostream>
#include <cuda_runtime.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp> struct image_pixel {
uchar r;
uchar g;
uchar b;
}; __global__ void Rgb2Gray(image_pixel *d_color_data, uchar *d_gray_data, int image_rows, int image_cols) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y; if (i < image_cols && j < image_rows) {
int pixel_index = image_cols * j + i;
image_pixel pixel = d_color_data[pixel_index];
d_gray_data[pixel_index] = pixel.r * 0.299 + pixel.g * 0.587 + pixel.b * 0.114;
}
} int main(int argc, char *argv[]) {
cv::Mat image = cv::imread("/home/yansheng/Pictures/fbb.jpg");
if (!image.isContinuous()) {
std::cout << "The image data is not continuous" << std::endl;
return -1;
}
int image_rows = image.rows;
int image_cols = image.cols; std::cout << "Image Width: " << image.cols << std::endl;
std::cout << "Image Height: " << image.rows << std::endl; image_pixel *d_color_data;
uchar *d_gray_data;
cudaMalloc((void **)&d_color_data, image_rows * image_cols * sizeof(image_pixel));
cudaMalloc((void **)&d_gray_data, image_rows * image_cols); cudaMemcpy(d_color_data, image.data, image_rows * image_cols * sizeof(image_pixel), cudaMemcpyHostToDevice); dim3 block_dim(16, 16);
dim3 grad_dim(image_cols / block_dim.x + 1, image_rows / block_dim.y + 1); Rgb2Gray<<<grad_dim, block_dim>>>(d_color_data, d_gray_data, image_rows, image_cols); cv::Mat gray(image.size(), CV_8UC1);
cudaMemcpy(gray.data, d_gray_data, image_rows * image_cols, cudaMemcpyDeviceToHost); cv::imshow("Gray", gray);
cv::waitKey(); return 0;
}

Rgb2Gray的更多相关文章

  1. verilog实现rgb2gray

    前言 项目算法需求,需要将RGB彩色图像转换为灰度图像,算法原理是很简单的,但是对于刚接触FPGA的宝宝来说,进行时序的设计和调试还是不那么容易的,为了省事儿,就按照上一篇中值滤波(http://ww ...

  2. RGB2YCbCr RGB2Gray

    Y = 0.2990R+0.5870G+0.1140B;                        Cb=-0.1687R-0.3313G+0.5000B+128;                 ...

  3. opencv中彩色图转换成灰度图rgb2gray

    imread函数读入图像: 只需要将imread的第二个参数置为0即可. Mat imread(const string& filename, intflags=1 ); 第一个参数是载入图片 ...

  4. RGB2GRAY 各种算法速度比较,整形乘法比查表法快!

    1.  查表法,外循环用 这种格式 :  //for(int j = 0; j != h; ++j)// for(int i = 0; i!=w;++i)//. for(int j = 0; j != ...

  5. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  6. SVD的几何意义,以及在去噪,推荐系统中的应用

    很多文章说到奇异值分解的时候总是大概罗列下它的功能,并没有对功能及物理意义进行过多的阐述,现在我来对奇异值进行整理一下. 一 奇异值分解 对任意的矩阵A∈Fmn,rank(A)=r(矩阵的秩),总可以 ...

  7. DOG检测

    共享一个代码算了,太忙鸟,有时间在补充. function [] = dog_learn() img = imread('/Users/img/lena.png'); img = rgb2gray(i ...

  8. 一维码:EAN-13码的识别

    1.一维码简述: 一维条码是一种能用于信息编码和信息自动识别的标准符号,是由一组宽度不同的黑白符号按一定规则交替排列编码组成的图形符号,用于表示一定的信息. 码制指条码符号的类型,不同的类型有不同的编 ...

  9. matlab函数大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

随机推荐

  1. Dubbo+zookeeper面试题补充

    什么是分布式?什么是集群?主要区别 分布式是将一个服务分个部分,然后通过远程调用方式进行.远程调用框架RPC框架,spring cloud,dubbo.集群是将同一个服务的多个副本部署在不同的集群上, ...

  2. Github(远程仓库) 2

    远程仓库之前就添加好了 今天弄了简单的查看远程库,提取远程库,在线修改以及本地更新修改,推送到远程仓库,删除远程仓库,参考http://www.runoob.com/git/git-remote-re ...

  3. Windows 10 系统,配置jdk系统环境变量

    1. 下载jdk包,下载路径为:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html, ...

  4. Swagger注解

    swagger注解说明  1.与模型相关的注解,用在bean上面 @ApiModel:用在bean上,对模型类做注释: @ApiModelProperty:用在属性上,对属性做注释 2.与接口相关的注 ...

  5. cdnbest独立主控用户如何开通日志分析

    1.cdn独立主控用户开通日志分析,先用授权的帐号在官网平台登陆,然后购买日志套餐 2.在自已的主控平台还要做两步操作: 1.增加个日志套餐,内容随便,因为设置是无效的,只是需要一个套餐 2. 给用户 ...

  6. MongoDB:索引操作

    首先插入十万个数据 ;i;i++){ var rand = parseInt(i*Math.random()); db.person_test.insert({"name":&qu ...

  7. HDU6446 Tree and Permutation(树上DP)

    传送门:点我 Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

  8. eclipse中tomcat可以start启动,无法debug启动的解决

    设置断点,进行程序调试,但是debug启动tomcat,却无法启动,并且会报超时异常. 原因可能是eclipse和tomcat启动时读取文件发生冲突 去掉所有的断点,然后重新debug启动,再设置断点 ...

  9. iis7 部署 mvc4项目提示404错误

    1.装了.net framework 4.0框架 2.重新注册了asp.net_iisreg -i 访问mvc项目仍提示404错误 搜了一下,有些服务器还要装个补丁 https://support.m ...

  10. centos 安装解压工作

    解压工具: yum install ark 编辑器: yum install gedit