CUDA + OpenCV实现CUDA By Example中波纹示例

参考了网上其他人的CUDA + OpenCV实现Julia Set的例子( https://blog.csdn.net/Ricardo232525/article/details/74178963),用到了波纹示例上,代码如下:

#include "device_launch_parameters.h"
#include "cuda_runtime.h"  
#include <highgui.hpp>  

using namespace cv;
#define DIM 512

struct DataBlock{
unsigned char *dev_bitmap;
};


__global__ void kernel(unsigned char *ptr, int ticks)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;


float fx = x - DIM / 2;
float fy = y - DIM / 2;
float d = sqrtf(fx * fx + fy * fy);


unsigned char grey = (unsigned char)(128.0f + 127.0f * cos(d / 10.0f - ticks / 7.0f) / (d / 10.0f + 1.0f));


//bitmap 改为3个通道赋值
ptr[offset * 3 + 0] = 255;
ptr[offset * 3 + 1] = grey;
ptr[offset * 3 + 2] = grey;
//ptr[offset * 4 + 3] = 255;
}


void generate_frame(DataBlock *data, int ticks)
{
cudaError_t status;
Mat image = Mat(DIM, DIM, CV_8UC3, Scalar::all(0));
namedWindow("CUDA For Ripple", 2);


status = cudaMalloc((void**)&data->dev_bitmap,
3 * image.cols*image.rows);


// block和thread阵列都是2-D的.
dim3 blocks(DIM / 16, DIM / 16);
dim3 threads(16, 16);

while (true)
{
//没有输入数组或者图像, 所以没有向device拷贝的步骤.
kernel << <blocks, threads >> >(data->dev_bitmap, ticks);
cudaDeviceSynchronize();
status = cudaMemcpy(image.data, data->dev_bitmap,
3 * image.cols*image.rows,
cudaMemcpyDeviceToHost);

imshow("CUDA For Ripple", image);
//检测到按键则退出。
if (cvWaitKey(30) >= 0)break;
//ticks递增。
ticks += 2;
}
status = cudaFree(data->dev_bitmap);


}

int main(void)
{
DataBlock data;
generate_frame(&data, 2);

}

结果其中一帧截图如下:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值