当前位置: 首页 > 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.lryc.cn/news/578212.html

相关文章:

  • 使用nomachine远程连接ARM设备桌面
  • C# 字符串中‘$‘和‘@‘的使用
  • C++的特殊类
  • STM32——DAP下载程序和程序调试
  • (4)pytest-fixture
  • Go语言安装使用教程
  • 深度剖析 LNK 参数隐藏攻击 (ZDI-CAN-25373)
  • 【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程
  • 门控循环单元(GRU):LSTM 的轻量级高效 “记忆专家”
  • Instrct-GPT 强化学习奖励模型 Reward modeling 的训练过程原理实例化详解
  • beforeRouteLeave 的触发本质
  • 2025年6月个人工作生活总结
  • 字节跳动 C++ QT PC客户端面试
  • 机器人仿真(1)Ubuntu24.04下CLion的ROS2开发环境配置
  • C++ 快速回顾(五)
  • 接口测试之接口关联
  • OpenCV CUDA模块设备层----- 正切(tangent)运算函数tan()
  • 一文讲清楚React中类组件与函数组件的区别与联系
  • C/C++ 使用rapidjson库 操作Json格式文件(创建、插入、解析、修改、删除)
  • 【2025最新】Ubuntu22.04 安装 MySQL8.0 教程
  • 零成本接入+企业级部署:2025年AI大模型实战指南
  • Linux云计算基础篇(2)
  • 对称非对称加密,https和http,https通讯原理,Charles抓包原理
  • 三态门Multisim电路仿真——硬件工程师笔记
  • 大模型在多发性硬化预测及治疗方案制定中的应用研究
  • Python 安装使用教程
  • 探索未来AI的无限可能:使用oTTomator Live Agent Studio平台上的开源AI代理!
  • JSON-LD 开发手册
  • 衡石科技chatbot分析手册--钉钉数据问答机器人配置
  • 衡石科技使用手册-企业即时通讯工具数据问答机器人用户手册