目录
1. 获取最大值或最小值 cv::max()/min()
2. 获取最大值和最小值 cv::minMaxIdx()/minMaxLoc()
3. 获取平均值 cv::mean()
4. 获取平均值和标准差
cv::max()函数计算矩阵src1和src2中每个对应的像素对的最大值。cv::min()计算两个矩阵的对应元素的最小值。
这两个函数都有两种基本形式:一种是返回一个矩阵表达式,另一种是计算结果并将其放在指定的地方。在第二种情况下,如果其中一个参数是cv::Scalar,与多通道矩阵的比较是以每个通道为基础与cv::Scalar的相应元素进行比较。
// 如下函数名可以是max或min。
cv::MatExpr cv::max(
const cv::Mat& src1, // First input array(first position
const cv::Mat& src2 // second input array
);
cv::MatExpr cv::max(
const cv::Mat& src1, // first input array(first position)
double value // Scalar in second position
);
cv::MatExpr cv::max(
double value, // Scalar in first position
const cv::Mat& src1 // input array(second position
);
void cv::max(
cv::InputArray src1, // first input array
cv::InputArray src2, // second input array
cv::OutputArray dst // result array
);
void cv::max(
const cv::Mat& src1, // first input array
const cv::Mat& src2, // second input array
cv::Mat& dst // result array
);
void cv::max(
const Mat& src1, // input array
double value, // Scalar input
cv::Mat& dst // result array
);
使用示例:
float fData1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
float fData2[] = { 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 };
cv::Mat src1(1, 10, CV_32FC1, fData1);
cv::Mat src2(1, 10, CV_32FC1, fData2);
cv::Mat dst;
cv::max(src1, src2, dst);
std::cout << "src1 = \n " << src1 << std::endl;
std::cout << "src2 = \n " << src2 << std::endl;
std::cout << "dst = \n " << dst << std::endl;
cv::min(src1, 5, dst);
std::cout << "dst = \n " << dst << std::endl;
显示结果:
cv::minMaxIdx()和cv::minMaxLoc()两个函数都可以获取到最大值和最小值以及它们在矩阵中所处的位置,这两个函数的原型:
void cv::minMaxIdx(
cv::InputArray src, // input array single channel only
double *minVal, // min value
double *maxVal, // max value
int* minIdx, // loc of min goes here (if not NULL)
int *maxIdx, // loc of max goes here (if not NULL)
cv::InputArray mask = cv::noArray() // search only nonzero values
);
void cv::minMaxIdx(
const cv::SparseMat& src, // input sparse array
double* minVal, // min value
double* maxVal, // max value
int* minIdx, // C-style array,indices of min locs
int* maxIdx // C-style array, indices of max locs
);
void cv::minMaxLoc(
cv::InputArray src, // input array
double* minVal, // min value
double* maxVal, // max value
cv::Point* minLoc, // loc of min goes here
cv::Point* maxLoc, // loc of max goes here
cv::InputArray mask = cv::noArray() // search only nonzero values
);
void cv::minMaxLoc(
const cv::SparseMat& src, // input sparse array
double* minVal, // min value
double* maxVal, //max value
cv::Point* minLoc, // C-style array,indices of min locs
cv::Point* maxLoc // C-style array,indices of max locs
);
这两个函数都计算矩阵src中的最小值和最大值,并且可以返回它们的位置。最小值和最大值用minVal和maxVal表示,位置用minIdx和maxIdx或minLoc和maxLoc表示。这两个函数的不同点在于:minMaxIdx()函数返回的位置类型是C风格的指针,支持的矩阵可以是任意维数;而minMaxLoc()函数返回的位置类型是cv::Point指针,支持的矩阵只能是二维矩阵。
对于minIdx或maxIdx,如果设置为NULL,表示不返回位置信息;如果minVal或maxVal设置为NULL,表示不计算。
如果处理的是稀疏矩阵(SparseMat),在搜索最大值或最小值时,仅考虑有效元素。
函数cv::mean()计算输入矩阵src中未被屏蔽的所有像素的平均值。如果src是多通道,则以每个通道为基础计算结果。函数原型:
cv::Scalar cv::mean(
cv::InputArray src,
cv::InputArray mask = cv::noArray() // optional, do only where nonzero
);
计算公式:
cv::meanStdDev()计算输入矩阵src中未被屏蔽的像素的平均值以及它们的标准差。如果src是多通道的,则以每个通道为基础计算平均值和标准差。函数原型:
void cv::meanStdDev(
cv::InputArray src,
cv::OutputArray mean,
cv::OutputArray stddev,
cv::InputArray mask = cv::noArray() // optional do only where nonzero
);
需要注意的是这里计算的标准差与协方差矩阵不同,这里的标准差是协方差矩阵的对角元素。如果要计算协方差矩阵,要使用cv::calcCovarMatrix()。