OpenCV CUDA模块设备层-----反向二值化阈值处理函数thresh_binary_inv_func()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

OpenCV CUDA 模块(cudev) 中的一个仿函数(functor)生成器,用于创建一个反向二值化阈值处理函数对象。

这个函数返回一个 仿函数对象(functor),用于在 GPU 上执行反向二值化阈值处理(Threshold Binary Inverted),即:

如果像素值小于等于 thresh,则设为 maxVal;否则设为 0。

函数原型

cpp 复制代码
template<typename T >
__host__ __device__ ThreshBinaryInvFunc<T> cv::cudev::thresh_binary_inv_func 	( 	T  	thresh,
		T  	maxVal 
	) 		

参数

  • T thresh 阈值,如果像素值小于等于该值则保留最大值
  • T maxVal 像素满足条件时设置的最大值

代码

cpp 复制代码
#include <opencv2/cudev.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

// CUDA kernel 使用 functor 对图像进行反向二值化
template <typename T>
__global__ void thresholdInvKernel(const T* input, T* output, int numPixels,
                                   cv::cudev::ThreshBinaryInvFunc<T> func) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx < numPixels) {
        output[idx] = func(input[idx]);
    }
}

int main() {
    // Step 1: 读取图像并转为灰度图
    cv::Mat bgr = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR);
    if (bgr.empty()) {
        std::cerr << "Failed to load image!" << std::endl;
        return -1;
    }

    cv::Mat src;
    cv::cvtColor(bgr, src, cv::COLOR_BGR2GRAY); // 灰度图

    int width = src.cols;
    int height = src.rows;
    int numPixels = width * height;

    // Step 2: 分配 GPU 内存
    uchar* d_input, *d_output;
    cudaMalloc(&d_input, numPixels * sizeof(uchar));
    cudaMalloc(&d_output, numPixels * sizeof(uchar));

    cudaMemcpy(d_input, src.data, numPixels * sizeof(uchar), cudaMemcpyHostToDevice);

    // Step 3: 创建反向二值化函数对象
    auto func = cv::cudev::thresh_binary_inv_func<uchar>(128, 255);

    // Step 4: 启动 kernel
    int blockSize = 256;
    int numBlocks = (numPixels + blockSize - 1) / blockSize;
    thresholdInvKernel<<<numBlocks, blockSize>>>(d_input, d_output, numPixels, func);

    // Step 5: 下载结果
    cv::Mat result(height, width, CV_8U);
    cudaMemcpy(result.data, d_output, numPixels * sizeof(uchar), cudaMemcpyDeviceToHost);

    // Step 6: 显示结果
    cv::imshow("Binary Inv Threshold Result", result);
    cv::waitKey(0);
    cv::imwrite("binary_inv_result.jpg", result);

    // Step 7: 清理资源
    cudaFree(d_input);
    cudaFree(d_output);

    return 0;
}

运行结果

相关推荐
罗西的思考1 分钟前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
美狐美颜sdk13 分钟前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
jimmyleeee26 分钟前
Agent安全之七:当智能体之间开始“互相信任”------深入理解 OWASP ASI07 不安全的智能体间通信
人工智能·安全
二哈赛车手26 分钟前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
Fluxproxy27 分钟前
大模型批量数据采集:AI 自动化工作流搭建实战
大数据·人工智能·自动化
AAwangzong30 分钟前
AI时代RPA技术解析:如何构建兼顾流程执行与智能决策的自动化平台?
人工智能·经验分享·rpa·智能体
达达表哥37 分钟前
AI综合站商业分发系统v3.1纯净版发布 附完整安装教程(排版修正版)
人工智能
众壹新能源科技1 小时前
逆变器直流开关柜温度监测与预防:红外巡检发现3个120度热点
运维·人工智能·自动化
NeoGressAI外贸数字化1 小时前
外贸独立站robots.txt怎么写:6个AI爬虫放行规则
人工智能·爬虫