OpenCV- reduce 函数

原文https://blog.csdn.net/leonardohaig/article/details/94452986

最近在对矩阵的每一列进行求和时,发现了一个函数cv::reduce(),该函数将我原本的的循环遍历操作代码量减少至了一行函数调用.
(一)说明:
该函数的作用是将二维数组转化为向量。
参数说明:
src:输入矩阵
dst:通过处理输入矩阵的所有行/列而得到的单行/列向量
dim:矩阵被简化后的维数索引.0意味着矩阵被处理成一行,1意味着矩阵被处理成为一列,-1时维数将根据输出向量的大小自动选择.
op:简化操作的方式,可以有以下几种取值:

在这里插入图片描述

注意reduce的输入与输出关系:
cv::reduce for SUM and 8U input can return only 32S, 32F or 64F types.

就是说输入如果是8U那么输出一定是32S, 32F or 64F其中一个。如果不在dtype设置,那么就默认输出的数据类型与输入类型一致。所以如果要输出32S类型的数据,就要在dtype进行设置!

换句话说,当输出矩阵所有行/列的和时,对该行/列数据进行累加,可能会超出矩阵类型的数据类型所表示的范围,因此此时需要指定输出矩阵的类型

(二)代码示例
下面是一个简单的例子,可以理解cv::reduce()函数的作用。

#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
    cv::Mat srcMat = (cv::Mat_<uchar >(3,3) <<
            225, 38, 22,
            67, 44, 12,
            89, 65, 63);

    std::cout<<"srcMat="<<std::endl;
    std::cout << srcMat << std::endl;

    cv::Mat output;

    //输出每列的最大值
    cv::reduce(srcMat, output, 0, cv::REDUCE_MAX);
    std::cout<<"Maximum value of each col:"<<std::endl;
    std::cout << output << std::endl;

    //输出每行的最小值
    cv::reduce(srcMat, output, 1, cv::REDUCE_MIN);
    std::cout<<"Minimum value of each row:"<<std::endl;
    std::cout << output << std::endl;

    //输出每列的均值
    cv::reduce(srcMat, output, 0, cv::REDUCE_AVG);
    std::cout<<"Average value of each col:"<<std::endl;
    std::cout << output << std::endl;

    //输出每列的和
    //Note:此时需要指定输出矩阵的类型,求和时,uchar值的和可能会超过其表示范围,所以需要显式指定类型
    cv::reduce(srcMat, output, 0, cv::REDUCE_SUM,CV_32SC1);
    std::cout<<"Summation value of each col:"<<std::endl;
    std::cout << output << std::endl;
    return 0;
}

代码输出:

srcMat=
[225,  38,  22;
  67,  44,  12;
  89,  65,  63]
Maximum value of each col:
[225,  65,  63]
Minimum value of each row:
[ 22;
  12;
  63]
Average value of each col:
[127,  49,  32]
Summation value of each col:
[381, 147, 97]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值