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

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

算法描述

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

主要函数

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

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

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

原型
cpp 复制代码
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

原型
cpp 复制代码
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

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

代码示例

cpp 复制代码
#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 );

    // 将矩阵上传到GPU
    cv::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;
}

运行结果

bash 复制代码
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)
相关推荐
吴佳浩2 小时前
Python入门指南(七) - YOLO检测API进阶实战
人工智能·后端·python
tap.AI3 小时前
RAG系列(二)数据准备与向量索引
开发语言·人工智能
老蒋新思维3 小时前
知识IP的长期主义:当AI成为跨越增长曲线的“第二曲线引擎”|创客匠人
大数据·人工智能·tcp/ip·机器学习·创始人ip·创客匠人·知识变现
货拉拉技术3 小时前
出海技术挑战——Lalamove智能告警降噪
人工智能·后端·监控
wei20233 小时前
汽车智能体Agent:国务院“人工智能+”行动意见 对汽车智能体领域 革命性重塑
人工智能·汽车·agent·智能体
LinkTime_Cloud4 小时前
快手遭遇T0级“黑色闪电”:一场教科书式的“协同打击”,披上了AI“智能外衣”的攻击
人工智能
PPIO派欧云4 小时前
PPIO上线MiniMax-M2.1:聚焦多语言编程与真实世界复杂任务
人工智能
隔壁阿布都4 小时前
使用LangChain4j +Springboot 实现大模型与向量化数据库协同回答
人工智能·spring boot·后端
Coding茶水间4 小时前
基于深度学习的水面垃圾检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
乐迪信息4 小时前
乐迪信息:煤矿皮带区域安全管控:人员违规闯入智能识别
大数据·运维·人工智能·物联网·安全