CUDA:Sobel算子处理

cpp 复制代码
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;

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


    int index = y * Width + x;
    unsigned char x0, x1, x2, x3, x4, x5, x6, x7, x8;
    int Gx = 0, Gy = 0;


    if(x > 0 && x < Width - 1 && y > 0 && y < Height - 1) {
        x0 = in[(y - 1) * Width + (x - 1)];
        x1 = in[(y - 1) * Width + x];
        x2 = in[(y - 1) * Width + x + 1];


        x3 = in[y * Width + x - 1];
        x4 = in[y * Width + x];
        x5 = in[y * Width + x + 1];


        x6 = in[(y + 1) * Width + (x - 1)];
        x7 = in[(y + 1) * Width + x];
        x8 = in[(y + 1) * Width + (x + 1)];


        Gx = (x0 + 2 * x3 + x6) - (x2 + 2 * x5 + x8);
        Gy = (x0 + 2 * x1 + x2) - (x6 + 2 * x7 + x8);
        out[index] = (abs(Gx) + abs(Gy)) / 2;
    }
}


int main()
{
    cv::Mat img = cv::imread("noise.png", 0);
    int height = img.rows;
    int width = img.cols;


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


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


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


    cudaMalloc((void**)&in_gpu, memsize);
    cudaMalloc((void**)&out_gpu, memsize);


    dim3 threadsBlocks(32, 32);
    dim3 blocksGrid((width + threadsBlocks.x - 1) / threadsBlocks.x, (height + threadsBlocks.y - 1) / threadsBlocks.y);


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


    sobel_gpu<<<blocksGrid, threadsBlocks>>>(in_gpu, out_gpu, height, width);


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


    cv::imwrite("save.png", dst_gpu);


    cudaFree(in_gpu);
    cudaFree(out_gpu);


    printf("Finished \n");
    return 0;
}

CMakeLists.txt配置

cpp 复制代码
cmake_minimum_required(VERSION 3.10)

project(CSobel LANGUAGES CXX CUDA)

add_definitions(-std=c++11)
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O0 -Wfatal-errors -pthread -w -g")


set(OpenCV_DIR ${PROJECT_SOURCE_DIR}/../../3rdparty/opencv3.4.15)

find_package(CUDA REQUIRED)

include_directories(
    ${PROJECT_SOURCE_DIR}
    ${OpenCV_DIR}/include
)

link_directories(
    ${PROJECT_SOURCE_DIR}/lib
    ${OpenCV_DIR}/lib
)

cuda_add_executable(bilateral main.cu)

target_link_libraries(bilateral opencv_world)
相关推荐
小炫y4 分钟前
基于规则的NLP技术-词的处理
人工智能·自然语言处理
冬奇Lab11 分钟前
LLM 驱动的自动化测试系列(09):移动端自动化(五)——当通用 Agent 框架下沉到测试场景
人工智能·agent·测试
冬奇Lab11 分钟前
开源项目第233期:Open-XiaoAI — 刷机接管小米小爱音箱,接入 ChatGPT/小智 AI/Gemini Live
人工智能·开源·资讯
Sayai17 分钟前
MCP Server 开发实战:Spring AI 把后端日志查询暴露给 AI Agent(7 条设计原则与踩坑实录)
java·人工智能·ai agent·spring ai·mcp
阿_旭30 分钟前
【AI前沿】GTR:一套网络通吃检测/分割/姿态/深度六大任务,对标YOLO26
人工智能
AI你一生一世31 分钟前
当一句自然语言指令穿透三层抽象:从“把按钮改成蓝色“看 AI 编码代理的真实边界
人工智能·自然语言处理·前端架构·技术债·设计令牌·ai编码代理·代码抽象
袋鼠云数栈38 分钟前
非结构化数据也能“周期调度“:离线开发BatchWorks的多模态数据同步实践
大数据·人工智能·多模态数据·离线开放
算了吧956941 分钟前
GEO服务商选型指南:2026年企业评估框架与决策路径
大数据·人工智能·物联网
workflower43 分钟前
矿用机器人人工智能安全与治理体系
人工智能·安全·机器学习·机器人·云计算·无人机
tianbin91143 分钟前
从模型微调到API调用:大模型训练后的高效工程化落地路径
人工智能