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

OpenCV CUDA模块中矩阵操作-----矩阵最大最小值查找函数

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

算法描述

在OpenCV的CUDA模块中,矩阵最大最小值查找操作用于快速获取矩阵中的全局最小值、最大值及其位置。这些函数对于图像处理任务特别有用,例如特征检测和阈值处理。

主要函数

1. [查找矩阵的全局最小值和最大值] cv::cuda::minMax

原型
void cv::cuda::minMax
(InputArray src,          // 输入数组(通常是 cv::cuda::GpuMat)double* minVal,          // 输出指针,用于接收最小值double* maxVal,          // 输出指针,用于接收最大值InputArray mask = noArray()  // 可选掩码,默认为无掩码
);
参数
  • src: 输入矩阵。
  • minVal: 输出指针,用于接收最小值。
  • maxVal: 输出指针,用于接收最大值。
  • mask: 可选掩码,指定哪些元素参与计算,默认为无掩码。

2. [查找矩阵的全局最小值、最大值及其位置] cv::cuda::minMaxLoc

原型
void cv::cuda::minMaxLoc
(InputArray src,           // 输入数组double* minVal,           // 输出指针,用于接收最小值double* maxVal,           // 输出指针,用于接收最大值Point* minLoc,            // 输出指针,用于接收最小值的位置坐标Point* maxLoc,            // 输出指针,用于接收最大值的位置坐标InputArray mask = noArray()  // 可选掩码
);
参数
  • src: 输入矩阵。
  • minVal: 输出指针,用于接收最小值。
  • maxVal: 输出指针,用于接收最大值。
  • minLoc: 输出指针,用于接收最小值的位置坐标。
  • maxLoc: 输出指针,用于接收最大值的位置坐标。
  • mask: 可选掩码。

3. [将最小值和最大值写入输出数组] cv::cuda::findMinMax

原型
void cv::cuda::findMinMax
(InputArray src,          // 输入数组OutputArray dst,         // 输出数组,类型为 cv::Scalar,包含最小值和最大值InputArray mask = noArray(),  // 可选掩码Stream& stream = Stream::Null()  // CUDA流用于异步执行(可选)
);
参数
  • src: 输入矩阵。
  • dst: 输出数组,类型为cv::Scalar,包含最小值和最大值。
  • mask: 可选掩码。
  • stream: CUDA流用于异步执行(可选)。

4. [同时获取最小最大值和它们的位置] cv::cuda::findMinMaxLoc

原型
void cv::cuda::findMinMaxLoc
(InputArray src,          // 输入数组OutputArray minMaxVals,  // 输出数组,包含最小值和最大值OutputArray loc,         // 输出数组,包含最小值和最大值的位置InputArray mask = noArray(),  // 可选掩码Stream& stream = Stream::Null()  // CUDA流用于异步执行(可选)
);
参数
  • src: 输入矩阵。
  • minMaxVals: 输出数组,包含最小值和最大值。
  • loc: 输出数组,包含最小值和最大值的位置。
  • mask: 可选掩码。
  • stream: CUDA流用于异步执行(可选)。

代码示例

#include <iostream>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建测试矩阵(4x4 浮点型)cv::Mat h_mat = ( cv::Mat_< float >( 4, 4 ) << 1, -2, 3, -4, 5, -6, 7, -8, 9, -10, 11, -12, 13, -14, 15, -16 );// 将矩阵上传到GPUcv::cuda::GpuMat d_mat;d_mat.upload( h_mat );// 方法一:同步接口获取 min/max 及其位置double minVal, maxVal;cv::Point minLoc, maxLoc;cv::cuda::minMaxLoc( d_mat, &minVal, &maxVal, &minLoc, &maxLoc );std::cout << "Min value: " << minVal << "\n";std::cout << "Max value: " << maxVal << "\n";std::cout << "Min location: (" << minLoc.x << ", " << minLoc.y << ")\n";std::cout << "Max location: (" << maxLoc.x << ", " << maxLoc.y << ")\n";// 方法二:异步接口获取 min/max 及其位置cv::cuda::GpuMat d_minMaxVals, d_loc;cv::cuda::findMinMax( d_mat, d_minMaxVals );            // 得到 [min, max]cv::cuda::findMinMaxLoc( d_mat, d_minMaxVals, d_loc );  // 必须传入前一步结果!// 下载数值cv::Mat host_minMaxVals;d_minMaxVals.download( host_minMaxVals );if ( host_minMaxVals.type() != CV_32F || host_minMaxVals.total() != 2 ){std::cerr << "Unexpected type or size for minMaxVals!" << std::endl;return -1;}const float* vals = reinterpret_cast< const float* >( host_minMaxVals.data );std::cout << "Downloaded min value: " << vals[ 0 ] << "\n";std::cout << "Downloaded max value: " << vals[ 1 ] << "\n";// 下载位置cv::Mat host_loc;d_loc.download( host_loc );std::cout << "loc type: " << host_loc.type() << std::endl;std::cout << "loc total elements: " << host_loc.total() << std::endl;if ( host_loc.type() != CV_32SC1 || host_loc.total() != 2 ){std::cerr << "Unexpected type or size for loc! Type: " << host_loc.type() << ", Size: " << host_loc.total() << std::endl;return -1;}const int* locData = host_loc.ptr< int >();std::cout << "Downloaded min location: (" << locData[ 0 ] << ", " << locData[ 1 ] << ")\n";std::cout << "Downloaded max location: (" << locData[ 2 ] << ", " << locData[ 3 ] << ")\n";return 0;
}

运行结果

Min value: -16
Max value: 15
Min location: (3, 3)
Max location: (2, 3)
Downloaded min value: -16
Downloaded max value: 15
loc type: 4
loc total elements: 2
Downloaded min location: (15, 14)
Downloaded max location: (0, 0)
http://www.xdnf.cn/news/6502.html

相关文章:

  • 产品销量数据爬虫通用模板
  • js关于number类型的计算问题
  • msf安卓远控木马手动捆绑正常apk
  • LLM中最后一个位置的对数概率是什么? 怎么作为LOSS实现方式
  • C++23 新特性:ranges::contains 与 ranges::contains_subrange
  • 线代第二章矩阵第九、十节:初等变换、矩阵的标准形、阶梯形与行最简阶梯形、初等矩阵
  • RPA 自动化实现自动发布
  • 基于matlab实现AUTOSAR软件开发---答疑6
  • 瓶装燃气送气工考试的实操考核内容有哪些?
  • Python训练营打卡 Day26
  • Git - 1( 14000 字详解 )
  • 动态库和静态库的区别
  • 攻击溯源技术体系:从理论架构到工程化实践的深度剖析
  • SQL实战:06交叉日期打折问题求解
  • 论文学习_Precise and Accurate Patch Presence Test for Binaries
  • 浅析 Spring 启动过程:从源码到核心方法
  • 【Redis】双向链表结构
  • ARM A64 LDR指令
  • constexpr 关键字的意义(入门)
  • 关于在深度聚类中Representation Collapse现象
  • RM算法的地下宫殿
  • 解决 Conda 安装 PyTorch 1.1.0 报错:excluded by strict repo priority(附三种解决方案)
  • 射击游戏demo11
  • 微服务如何实现服务的高并发
  • idea整合maven环境配置
  • 幼儿学前教育答辩词答辩技巧问题答辩自述稿
  • IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖
  • MapReduce架构-打包运行
  • gitlab+portainer 实现Ruoyi Vue后端CI/CD
  • Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验