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

    public class Codec { // Encodes a tree to a single string. public string serialize(TreeNode root) { ...

  2. 深度学习原理与框架-Alexnet(迁移学习代码) 1.sys.argv[1:](控制台输入的参数获取第二个参数开始) 2.tf.split(对数据进行切分操作) 3.tf.concat(对数据进行合并操作) 4.tf.variable_scope(指定w的使用范围) 5.tf.get_variable(构造和获得参数) 6.np.load(加载.npy文件)

    1. sys.argv[1:]  # 在控制台进行参数的输入时,只使用第二个参数以后的数据 参数说明:控制台的输入:python test.py what, 使用sys.argv[1:],那么将获得w ...

  3. 一个free异常引发的异常

    有同事反馈说自己的线程不工作,查看堆栈发现其打印如下: # # # # # # # # , info= # <signal handler called> # # # # # # # , ...

  4. ArcGIS自定义工具箱-修复损坏的工作空间

    ArcGIS自定义工具箱-修复损坏的工作空间 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:替换数据源的工作空间 用途:针对损坏的数据源,批量进行修复 案例数 ...

  5. C语言实现的反转字符串

    这段代码大约是10年前写的了,一直收藏在自己的代码仓库里面,贴出来分享下. 网上也有很多类似的代码,学生们用的比较多,工作中用的很少,权做参考. char* ReverseString(char* s ...

  6. netty 为什么用nio 不用 aio

    NIO模型 同步非阻塞 NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才 ...

  7. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

  8. [转]jquery.form.js的ajaxSubmit和ajaxForm使用

    参考 http://www.cnblogs.com/popzhou/p/4338040.html 依赖的脚本文件 <script src="../Javascript/jquery-1 ...

  9. pyspider--post

    #!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2018-08-19 14:47:28# Project: HBGGZY_SBJ ...

  10. Intellij IDEA中maven更新不下来pom中的jar包,reimport失效

    问题: Intellij IDEA中使用maven reimport包,一直失败 即使我将本地已存在的一个jar包目录删除了,pom文件那里也没飘红提示找不到  解决方法: maven设置中去掉离线下 ...