当前位置: 首页 > news >正文

OpenCV CUDA模块设备层----计算向量的平方根函数sqrt

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

算法描述

OpenCV 的 CUDA 设备函数(device function),用于在 GPU 上计算一个 uchar4 类型向量的平方根,并返回一个 float4 类型的结果。
这个函数通常出现在 OpenCV 的 CUDA 加速图像处理代码中,例如:

  • 图像归一化(Normalization)
  • 色彩空间转换
  • 卷积、滤波等操作中涉及数值稳定性的平方根计算

它被设计为在 CUDA kernel 中高效使用,适用于需要对图像像素批量执行数学运算的高性能场景。

函数原型

__device__ __forceinline__ float4 cv::cudev::sqrt(const uchar4 &a)

参数

  • const uchar4 &a 输入参数是一个 uchar4 类型的常量引用(即 4 个无符号字符)

代码


#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudev.hpp>
#include <iostream>__global__ void sqrtKernel(const uchar4* input, float4* output, int numPixels) {int idx = blockIdx.x * blockDim.x + threadIdx.x;if (idx < numPixels) {output[idx] = cv::cudev::sqrt(input[idx]);}
}int main() {// 读取图像(RGBA 格式)cv::Mat bgr = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/img0.jpg");if (bgr.empty()) {std::cerr << "Failed to load image!" << std::endl;return -1;}// 转换为 RGBAcv::Mat src;cv::cvtColor(bgr, src, cv::COLOR_BGR2BGRA);int width = src.cols;int height = src.rows;int numPixels = width * height;// 将输入图像上传到 GPUuchar4* d_input;cudaMalloc(&d_input, numPixels * sizeof(uchar4));cudaMemcpy(d_input, src.ptr<uchar4>(), numPixels * sizeof(uchar4), cudaMemcpyHostToDevice);// 分配输出内存float4* d_output;cudaMalloc(&d_output, numPixels * sizeof(float4));// 启动 kernelint blockSize = 256;int numBlocks = (numPixels + blockSize - 1) / blockSize;sqrtKernel<<<numBlocks, blockSize>>>(d_input, d_output, numPixels);// 下载结果回 CPUcv::Mat result(height, width, CV_32FC4);cudaMemcpy(result.ptr<float4>(), d_output, numPixels * sizeof(float4), cudaMemcpyDeviceToHost);// 显示或保存结果(例如将每个通道 clamp 到 [0,1] 并归一化显示)cv::Mat display;cv::normalize(result, display, 0, 1, cv::NORM_MINMAX, CV_32F);cv::imshow("Result", display);cv::waitKey(0);// 清理资源cudaFree(d_input);cudaFree(d_output);return 0;
}

运行结果

在这里插入图片描述

http://www.dtcms.com/a/262949.html

相关文章:

  • 基于Spring Boot的绿园社区团购系统的设计与实现
  • Python 安装使用教程
  • Spring Boot 启动性能优化实战指南
  • 基于 SpringBoot+Vue.js+ElementUI 的 Cosplay 论坛设计与实现7000字论文
  • 【硬核数学】2.7 理论与现实的鸿沟:深度学习的数值稳定性挑战《从零构建机器学习、深度学习到LLM的数学认知》
  • 【Spring】——事务、整合、注解
  • 后台管理系统模板Art Design Pro
  • js代码03
  • Karmada 多集群服务发现
  • Apache Doris Profile 深度解析:从获取到分析,解锁查询性能优化密码
  • RedhatCentos挂载镜像
  • LeetCode Hot100(图论)
  • SQL参数化查询:防注入与计划缓存的双重优势
  • 使用 Sqlcmd 高效导入大型 SQL Server 数据库脚本 (.sql)
  • 深入理解 B+ 树:数据库索引的脊梁
  • AI初学者如何对大模型进行微调?——零基础保姆级实战指南
  • vscode一个文件夹有残余的git仓库文件,已经失效了,怎样进行清空仓库残余文件并重新初始化git--ubuntu
  • 【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
  • 炸鸡派-基础测试例程
  • Linux入门篇学习——Ubuntu 系统介绍和Ubuntu启用root用户
  • 在线五子棋对战项目
  • 1.1_2 计算机网络的组成和功能
  • python+uniapp基于微信小程序的食堂菜品查询系统
  • Deepoc 大模型:无人机行业的智能变革引擎
  • vue-33(实践练习:使用 Nuxt.js 和 SSR 构建一个简单的博客)
  • SpringCloud Gateway
  • C++ 第四阶段 STL 容器 - 第五讲:详解 std::set 与 std::unordered_set
  • 蓝牙耳机开发--探讨AI蓝牙耳机功能、瓶颈及未来展望
  • 链表题解——两两交换链表中的节点【LeetCode】
  • AWS 开源 Strands Agents SDK,简化 AI 代理开发流程