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

OpenCV CUDA模块设备层----- 正切(tangent)运算函数tan()

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

算法描述

OpenCV的CUDA模块(cudev)中的一个设备函数(device function),用于在 GPU 上对uchar3类型的向量(如 RGB 像素)进行正切(tangent)运算,并返回一个 float3 类型的结果。

函数原型

__device__ __forceinline__ float3 cv::cudev::tan(const uchar3 &a)

参数

  • const uchar3 &a 输入参数为一个 3 通道的无符号字符向量(如 RGB 像素)

代码

#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudev.hpp>
#include <iostream>__global__ void tanKernel(const uchar3* input, float3* output, int numPixels) {int idx = blockIdx.x * blockDim.x + threadIdx.x;// if (idx < numPixels) {output[idx] = cv::cudev::tan(input[idx]);// }
}int main() {// 读取图像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;}// 转换为 RGB 格式(uchar3)cv::Mat src;cv::cvtColor(bgr, src, cv::COLOR_BGR2RGB);int width = src.cols;int height = src.rows;int numPixels = width * height;// 分配 GPU 内存uchar3* d_input;float3* d_output;cudaMalloc(&d_input, numPixels * sizeof(uchar3));cudaMalloc(&d_output, numPixels * sizeof(float3));cudaMemcpy(d_input, src.ptr<uchar3>(), numPixels * sizeof(uchar3), cudaMemcpyHostToDevice);// 启动 kernelint blockSize = 256;int numBlocks = (numPixels + blockSize - 1) / blockSize;tanKernel<<<numBlocks, blockSize>>>(d_input, d_output, numPixels);// 下载结果cv::Mat result(height, width, CV_32FC3);cudaMemcpy(result.ptr<float3>(), d_output, numPixels * sizeof(float3), cudaMemcpyDeviceToHost);// 显示结果(注意:可能有非常大的值)cv::Mat display;cv::normalize(result, display, 0, 1, cv::NORM_MINMAX, CV_32F);cv::imshow("Tan Result", display);cv::waitKey(0);// 清理资源cudaFree(d_input);cudaFree(d_output);return 0;
}

运行结果

在这里插入图片描述

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

相关文章:

  • Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础
  • R1-Searcher使用强化学习增强语言模型解决问题的搜索能力
  • WebSocket 的核心原理和工作流程
  • 前端Vue面试八股常考题(一)
  • 企业流程知识:《超越再造:以流程为中心的组织如何改变我们的工作和生活》读书笔记
  • 力扣面试150(7/150)
  • 【c/c++2】多线程,动静态库,信号,socket
  • 如何让宿主机完全看不到Wi-Fi?虚拟机独立联网隐匿上网实战!
  • 【知识图谱构建系列7】:结果评价(1)
  • 可编辑39页PPT | 数字化工厂蓝图整体框架建设举措建设路径实施路线规划建设方案
  • 从入门到精通:npm、npx、nvm 包管理工具详解及常用命令
  • Microsoft Edge 打开无反应、打开后显示兼容性问题、卸载重装 解决方案。一键卸载Microsoft Edge 。
  • 卫朋:华为流程体系拆解系列——IPD流程L1-L6分级导入实战演练
  • android BottomSheet及AlertDialog的几种material3 常见ui的用法
  • vue上传各种文件,并预览组件,(预览,下载),下载resources目录下文件
  • vmware 17 安装win11 24h2
  • 【解析】 微服务测试工具Parasoft SOAtest如何为响应式架构助力?
  • MongoDB 常见查询语法与命令详解
  • 设计模式精讲 Day 19:观察者模式(Observer Pattern)
  • 自由学习记录(64)
  • 傅里叶变换理解
  • Instruct-GPT奖励模型的损失函数与反向传播机制解析
  • opencv入门(1)环境变量配置
  • FOC中V/F启动和I/F启动的区别
  • 零成本接入+企业级部署:2025年AI大模型实战指南
  • 企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云
  • 【零基础学AI】第14讲:支持向量机实战 - 文本分类系统
  • 华为云 Flexus+DeepSeek 征文|基于 Dify 平台开发智能客服 AI Agent 的完整实战指南
  • python+uniapp基于微信小程序蜀味道江湖餐饮管理系统nodejs+java
  • 矩阵方程 线性代数