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 ...
随机推荐
- java 调用 python 的几种方法整理
参考: https://blog.csdn.net/secondlieutenant/article/details/79000265
- kudu导入文件(基于impala)
kudu是cloudera开源的运行在hadoop平台上的列式存储系统,拥有Hadoop生态系统应用的常见技术特性,运行在一般的商用硬件上,支持水平扩展,高可用,集成impala后,支持标准sql语句 ...
- 目标检测框架py-faster-rcnn修改anchor_box
众所周知,anchor_box控制了回归框的大小,我们有时候检测的是大物体或小物体时,需要调整回归框的大小的时候,得改一下anchor_box.基于rgb公开的py-faster-rcnn修改anch ...
- Java CompletableFuture:allOf等待所有异步线程任务结束
private void method() throws ExecutionException, InterruptedException { CompletableFuture<String& ...
- python下划线的5种含义
本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类. 单下划 ...
- win server 2012 服务器不能ping通
以windows server 2012作为服务器,服务器能够ping通局域网中的客户端A,但A不能ping通服务器. 解决办法: 确定服务器中系统->远程设置->远程桌面选项下为允许选项 ...
- 50 【Go版本变化】
Go的版本介绍:https://golang.org/project/ https://golang.org/doc/go1.4 #Go1.4# 语言层面变化较少,但是编译器而言是有巨大的突破的,体现 ...
- 426. Convert Binary Search Tree to Sorted Doubly Linked List把bst变成双向链表
[抄题]: Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right po ...
- java重写equals方法需要注意的几点
为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...
- Javascript组成--ECMAScript,DOM,BOM
ECMAScript 部分 ECMAScript是一个标准,JS只是它的一个实现,其他实现包括ActionScript; “ECMAScript可以为不同种类的宿主环境提供核心的脚本编程能力”,即EC ...