原文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]