Rgb2Gray
- 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的更多相关文章
- verilog实现rgb2gray
前言 项目算法需求,需要将RGB彩色图像转换为灰度图像,算法原理是很简单的,但是对于刚接触FPGA的宝宝来说,进行时序的设计和调试还是不那么容易的,为了省事儿,就按照上一篇中值滤波(http://ww ...
- RGB2YCbCr RGB2Gray
Y = 0.2990R+0.5870G+0.1140B; Cb=-0.1687R-0.3313G+0.5000B+128; ...
- opencv中彩色图转换成灰度图rgb2gray
imread函数读入图像: 只需要将imread的第二个参数置为0即可. Mat imread(const string& filename, intflags=1 ); 第一个参数是载入图片 ...
- RGB2GRAY 各种算法速度比较,整形乘法比查表法快!
1. 查表法,外循环用 这种格式 : //for(int j = 0; j != h; ++j)// for(int i = 0; i!=w;++i)//. for(int j = 0; j != ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- SVD的几何意义,以及在去噪,推荐系统中的应用
很多文章说到奇异值分解的时候总是大概罗列下它的功能,并没有对功能及物理意义进行过多的阐述,现在我来对奇异值进行整理一下. 一 奇异值分解 对任意的矩阵A∈Fmn,rank(A)=r(矩阵的秩),总可以 ...
- DOG检测
共享一个代码算了,太忙鸟,有时间在补充. function [] = dog_learn() img = imread('/Users/img/lena.png'); img = rgb2gray(i ...
- 一维码:EAN-13码的识别
1.一维码简述: 一维条码是一种能用于信息编码和信息自动识别的标准符号,是由一组宽度不同的黑白符号按一定规则交替排列编码组成的图形符号,用于表示一定的信息. 码制指条码符号的类型,不同的类型有不同的编 ...
- matlab函数大全
Matlab 图像处理相关函数命令大全 一.通用函数: colorbar 显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...
随机推荐
- JSX
有一个 Babel 插件,用于在 Vue 中使用 JSX 语法,它可以让我们回到更接近于模板的语法上.JSX语法返回一个vnode对象 import AnchoredHeading from './A ...
- leetcode32
class Solution { public: int longestValidParentheses(string s) { ; stack<int> st; ; i < n; ...
- zabbix安装脚本
#!/bin/bash # #安装zabbix源.aliyun YUM源 #curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyu ...
- ajax请求导致status为canceled(无任何回调数据)的原因
1.故障现象 一个普通的ajax请求,请求能够到达controller,也能正常处理业务,但是ajax的回调函数为空,即没有任何状态和数据返回,使用谷歌浏览器查看请求状态如下图: 出现该错误:简单来说 ...
- CSS3实现投影效果
Webkit引擎定义了-webkit-box-reflect属性,该属性能够实现投影效果,具体语法如下: -webkit-box-reflect: <direction> <offs ...
- django 数据库配置 ,APP 迁移.模型基础
# 1.数据库的连接配置django 连接mysql的配置流程:- 安装 pymysql pip install pymysql- 创建数据库用户有创建数据库权限的用户- 创建数据库crm .进入数据 ...
- 515. Find Largest Value in Each Tree Row查找一行中的最大值
[抄题]: You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ ...
- 微软Office Online服务安装部署(一)
1.要使用office online功能,首先需要的是2台主机,并且主机的系统要求是windwos Server 我把他命名为Server和Client(两台服务器 用户必须为administrato ...
- Linq的执行效率及优化
描述:项目中使用了linq,发现写的顺序不一样最后的结果也不一样,效率也不一样. Linq的执行效率对比 List<int> source = new List<int>(); ...
- Py西游攻关之RabbitMQ、Memcache、Redis
Py西游攻关之RabbitMQ.Memcache.Redis RabbitMQ 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议 ...