• 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. leetcode49

    public class Solution { public IList<IList<string>> GroupAnagrams(string[] strs) { var L ...

  2. 关于Encode in UTF-8 without BOM

    定义BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码.它的编码是FEFF. 说明 在 UTF-8 文件中放置 BOM ...

  3. 初试Python语法小试牛刀之冒泡排序

    Python很火,心里很慌,没吃过猪肉,也要见见猪走路. 看了几天Python的语法,大概初步了解了一点点,https://www.liaoxuefeng.com/wiki/0014316089557 ...

  4. user story

    What is a user story? A user story is a short description of something that your customer will do wh ...

  5. [Ting's笔记Day8]活用套件carrierwave gem:(3)Deploy图片上传功能到Heroku网站

    前情提要: 身为Ruby新手村民,创造稳定且持续的学习步调很重要,我用的方法就是一周在IT邦写三篇笔记,希望藉由把笔记和遇到的bug记录下来的过程,能帮助到未来想用Ruby on Rails架站的新手 ...

  6. Jquery中父,子页面之间元素获取及方法调用

    一.jquery 父.子页面之间页面元素的获取,方法的调用: 1. 父页面获取子页面元素: 格式:$("#iframe的ID").contents().find("#if ...

  7. hdu2089-不要62-(数位dp)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 大数据入门到精通11-spark dataframe 基础操作

    // dataframe is the topic 一.获得基础数据.先通过rdd的方式获得数据 val ny= sc.textFile("data/new_york/")val ...

  9. D. Kilani and the Game(多源BFS)

    题目来源:http://codeforces.com/contest/1105/problem/D 题意:编号为1-k的点在一张n*m的表格中依次扩散,每个结点有各自的扩散速度且只可以往上下左右四个方 ...

  10. [leetcode]22. Generate Parentheses生成括号

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...