C++中minMaxLoc源码
时间: 2024-05-06 14:21:54 浏览: 76
C++标准库STL源码
以下是 OpenCV 中的 minMaxLoc 函数的 C++ 源代码:
```cpp
void cv::minMaxLoc(InputArray _src, double* minVal, double* maxVal, Point* minLoc, Point* maxLoc, InputArray _mask)
{
Mat src = _src.getMat(), mask = _mask.getMat();
CvMat c_src = src, c_mask = mask;
CvScalar c_minVal, c_maxVal;
CvPoint c_minLoc, c_maxLoc;
cvMinMaxLoc(&c_src, minVal, maxVal, &c_minLoc, &c_maxLoc, _mask.empty() ? 0 : &c_mask);
if( minVal || maxVal )
{
c_minVal.val[0] = *minVal; c_minVal.val[1] = *maxVal;
cvConvertScaleAbs(&c_minVal, &c_minVal, 255./(maxVal ? *maxVal - *minVal : 1.), 0);
*minVal = c_minVal.val[0]; *maxVal = c_minVal.val[1];
}
if( minLoc || maxLoc )
{
c_minLoc = cvPoint(c_minLoc.x + 1, c_minLoc.y + 1);
c_maxLoc = cvPoint(c_maxLoc.x + 1, c_maxLoc.y + 1);
}
if( minLoc )
*minLoc = c_minLoc;
if( maxLoc )
*maxLoc = c_maxLoc;
}
```
该函数首先将输入的源和蒙版矩阵转换为 OpenCV 适用的 CvMat 类型,然后调用 cvMinMaxLoc 函数计算最小和最大值以及它们的位置。如果指针 minVal 和 maxVal 不为空,则将最小和最大值转换为 0 到 255 范围内的整数。如果指针 minLoc 和 maxLoc 不为空,则将最小和最大位置加上 (1,1),因为 OpenCV 中的坐标从 (1,1) 开始而不是从 (0,0) 开始。最后,如果指针 minLoc 和 maxLoc 不为空,则将它们的值设置为计算的最小和最大位置。
阅读全文