cuda入门demo(2)——最基础的二方向sobel

news2024/11/20 20:44:37

⚠️主要是自己温习用,只保证代码正确性,不保证讲解的详细性。

今天继续总结cuda最基本的入门demo。很多教程会给你说conv怎么写,实际上sobel也是conv,并且conv本身已经用torch实现了。

之前在课题中尝试了sobel的变体,为了起一个复习的作用,我把原始sobel(不是变体)的代码备份到这里,比起变体,这个原始的非常简单,很适合学习。

目录

      • 最简单的sobel
      • sobel其实还有其他变体

最简单的sobel

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>

using namespace std;
using namespace cv;


__global__ void sobel_gpu(unsigned char* in, unsigned char* out, const int Height, const int Width) {
    int x = blockDim.y * blockIdx.y + threadIdx.y;
    int y = blockDim.x * blockIdx.x + threadIdx.x;

    // 只对非边缘地带进行计算
    if (x > 0 && x < Height - 1 && y > 0 && y < Width - 1) {
        int idx = x * Width + y;
        int idx_up = idx - Width;
        int idx_down = idx + Width;
        char gx_res = in[idx_up - 1] + 2 * in[idx - 1] + in[idx_down - 1] - in[idx_up + 1] - 2 * in[idx + 1] - in[idx_down + 1];
        char gy_res = in[idx_up - 1] + 2 * in[idx_up] + in[idx_up + 1] - in[idx_down - 1] - 2 * in[idx_down] - in[idx_down + 1];
        out[idx] = (gx_res + gy_res) / 2;
    }
    else if (x == 0 || x == Height - 1 || y == 0 || y == Width - 1) {
        int idx = x * Width + y;
        out[idx] = in[idx];
    }
}

int main() {
    Mat img = imread("lena.jpg", 0);
    int height = img.rows;
    int width = img.cols;

    int memsize = height * width * sizeof(unsigned char);

    Mat gaussImg;
    GaussianBlur(img, gaussImg, Size(3, 3), 0, 0, BORDER_DEFAULT);

    Mat dst_gpu(height, width, CV_8UC1, Scalar(0));

    unsigned char* in_gpu;
    unsigned char* out_gpu;

    // 接下来对模糊之后的图像进行处理
    cudaMalloc((void**)&in_gpu, memsize);
    cudaMalloc((void**)&out_gpu, memsize);

    dim3 threadsPerBlock(32, 32);
    dim3 blocksPerGrid((width + threadsPerBlock.x - 1) / threadsPerBlock.x, (height + threadsPerBlock.y - 1) / threadsPerBlock.y);

    cudaMemcpy(in_gpu, gaussImg.data, memsize, cudaMemcpyHostToDevice);

    sobel_gpu << < blocksPerGrid, threadsPerBlock > >> (in_gpu, out_gpu, height, width);

    cudaMemcpy(dst_gpu.data, out_gpu, memsize, cudaMemcpyDeviceToHost);

    imwrite("save.png", dst_gpu);
    cudaFree(in_gpu);
    cudaFree(out_gpu);

    return 0;
}

感兴趣的小伙伴可以自己去下载这个lena图,我就不提供了,一搜就有。

sobel其实还有其他变体

这个sobel有一些缺点:
在这里插入图片描述
直接看效果吧,这个效果如何不做评价,但是我的课题用这个肯定不是最优解…可以看到在边缘检测(或者直接叫它线条检测吧)上还有可提高的空间。所以现有文件还有什么可训练sobel、八方向sobel(这个我觉得还可以)。

你要是用到深度学习里面,我建议可以试试sobel的变体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打造完美美妆体验,化妆品商城软件系统助你一臂之力

化妆品商城软件系统采用先进的前后端分离技术&#xff0c;支持多种语言和数据库&#xff0c;具有良好的扩展性和可维护性。同时&#xff0c;一般系统还提供丰富的功能模块&#xff0c;包括商品管理、订单管理、用户管理、营销推广等&#xff0c;可以满足不同规模的化妆品商城的…

在windows配置redis的一些错误及解决方案

目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口&#xff0c;是可以正常连接的&#xff0c;但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…

关于CPU对Cache的访存操作 浅解

最近在做计算机组成原理关于高速缓存处理器的相关习题&#xff0c;由于一开始没有完全理解导致做题时特别崩溃。在做错无数次题后我感觉自己有必要总结一下自己对Cache的理解&#xff0c;以防以后再忘记。 一 | 前因 1 为什么需要Cache? 首先我们需要明白为什么需要使用Cac…

Unity Shader:闪烁

还是一样的分为UI闪烁和物体闪烁,其中具体可分为:UI闪烁、物体闪烁与半透明闪烁 1,UI闪烁 对于UI 还是一样的,改写UI本身的shader: Shader "UI/YydUIShanShder" {Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) = "white"…

[PM]敏捷开发之Scrum总结

在项目管理中&#xff0c;不少企业和项目团队也发现传统的项目管理模式已不能很好地适应今天的项目环境的要求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;本文将为大家介绍Scrum敏捷项目管理以及应用方法。 什么是Scrum敏捷项目管理 敏捷项目管理作为新兴的项目管理模…

一键生成动漫头像小程序源码-含搭建教程

这款程序用来做小程序矩阵&#xff0c;非常不错&#xff0c;可以把他放到你的其他小程序里&#xff0c;或者其他程序系统来弥补程序的丰富性&#xff0c;拓展可玩性。 很多抖音直播也在玩这个&#xff0c;玩法很简单&#xff0c;可以去参考那些直播间 这款程序没有后台&#xf…

python_PyQt5开发验证K线视觉想法工具V1.2_批量验证

目录 运行情况&#xff1a; ​编辑 结果json文件格式&#xff1a; 代码&#xff1a; 承接 【python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段】 博文 地址&#xff1a;python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段_程序猿与金融与科技的博客-…

使用node.js 搭建一个简单的HelloWorld Web项目

文档结构 config.ini #将本文件放置于natapp同级目录 程序将读取 [default] 段 #在命令行参数模式如 natapp -authtokenxxx 等相同参数将会覆盖掉此配置 #命令行参数 -config 可以指定任意config.ini文件 [default] authtokencc83c08d73357802 #对应一条隧…

【LeetCode】从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树 题目描述算法分析编程代码 链接: 从中序与后序遍历序列构造二叉树 题目描述 算法分析 编程代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : …

Vulnhub靶机DC-2 writeup

靶机介绍 靶机介绍&#xff1a;https : //download.vulnhub.com/dc/DC-2.zip ​ 信息搜集 获取IP地址 扫描靶机的IP的方法 1. nmap -sP 192.168.142.0/24 #nmap进行ping扫描发现存活主机 2. arp-scan -l #基于ARP发现内网存活主机 3. netdiscover -r 192.168.142.0/24 -…

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…

Vue2 第十七节 Vue中的Ajax

1.Vue脚手架配置代理 2.vue-resource 一.Vue脚手架配置代理 1.1 使用Ajax库 -- axios ① 安装 : npm i axios ② 引入: import axios from axios ③ 使用示例 1.2 解决开发环境Ajax跨域问题 跨域&#xff1a;违背了同源策略&#xff0c;同源策略规定协议名&#xff0…

智能的等价超越了数学的等价

尽管等价关系只是智能的一方面&#xff0c;还有其他一些如语言理解、创造性思维和决策能力等方面都可以作为评估智能的标志。 能否有效产生出等价关系仍然被视为智能出现的最重要标志之一。在认知科学和人工智能领域&#xff0c;智能通常被定义为具备理解、学习、推理和问题解决…

Python系统学习1-3

1、变量 变量&#xff1a;关联一个对象的标识符 学习目标&#xff1a;学会画变量的内存图 命名规则:字母数字下划线&#xff0c;所有单词小写&#xff0c;单词之间下划线隔开 赋值&#xff1a;创建一个变量或改变一个变量关联的数据。 语法&#xff1a;变量名数据&#xf…

【项目流程】前端项目的开发流程

1. 项目中涉及的所有角色及其职责 - PM 产品经理 产品经理&#xff08;Product Manager&#xff0c;简称PM&#xff09;负责明确和定义产品的愿景和战略&#xff0c;与客户、用户、业务部门和其他利益相关者进行沟通&#xff0c;收集并分析他们的需求和期望。负责制定产品的详…

使用FreeMarker导出word文档(支持导出图片)

今天跟大家分享一下工作中比较实用的导出word 带图片的功能。 对于在idea开发中我们需要引入以下依赖&#xff1a; 2.对于eclipse 开发我们需要进入对应的jar包 这个必须放在lib下&#xff0c;同样也需要在当前项目的环境是加入该依赖 需要在MEAT-INF加入 首先制定word 导出…

动画响应卡

html代码: <div class"container"><div class"card" style"--clr: #009688"><div class"img-box"><img src"https://www.jq22.com/newjs/img-01.png"></div><div class"content&quo…

RabbitMQ 教程 | 第8章 跨越集群的界限

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

面试热题100(买卖股票的最佳时机)

为什么有人夜里碰到股票问题&#xff0c;辗转反侧睡不着觉&#xff1f;为什么有人看到股票问题心理欢喜直接操作&#xff1f;你是想做哪类人&#xff1f;今天就揭秘股票问题&#xff0c;让你应对股票问题的时候可以如鱼得水。 这种问题一看就是动态规划问题&#xff0c;动态规划…

导入了Junit依赖,但@Test注解依然爆红~

错误描述如下所示&#xff1a; 原因&#xff1a; 解决方法&#xff0c;将<scope>test</scope>删除&#xff0c;再如下所示重新构建项目&#xff1a;