public Point2f FindSubPixelExtremePoint(Mat<float> image, bool white2black) { if (image == null) { throw new ArgumentNullException(nameof(image)); } Point2f extremaLoc; double minLoc, maxLoc; double extremaVal; Cv2.MinMaxLoc(image, out double minVal, out double maxVal, out minLoc, out maxLoc); if (white2black) { extremaVal = minVal; extremaLoc = minLoc; } else { extremaVal = maxVal; extremaLoc = maxLoc; } var criteria = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.Count, 20, 0.03); Cv2.CornerSubPix(image, new[] { extremaLoc }, new Size(3, 3), new Size(-1, -1), criteria); return extremaLoc; }基于opencvsharp4.6 的MinMaxLoc(InputArray src, out double minVal, out double maxVal);方法优化,生成新的 函数
时间: 2024-01-23 07:04:18 浏览: 116
基于OpenCvSharp 4.6的MinMaxLoc方法,可以优化成一个新的函数,如下所示:
```csharp
public Point2f FindSubPixelExtremePoint(Mat<float> image, bool white2black)
{
if (image == null)
{
throw new ArgumentNullException(nameof(image));
}
Point2f extremaLoc;
double extremaVal;
var criteria = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.Count, 20, 0.03);
if (white2black)
{
extremaLoc = Cv2.PointFromNormalized(new Point2f(0, 0));
Cv2.MinMaxLoc(image, out double minVal, out double _, out Point2f minLoc, out Point2f _);
Cv2.CornerSubPix(image, new[] { minLoc }, new Size(3, 3), new Size(-1, -1), criteria);
extremaVal = minVal;
extremaLoc = minLoc;
}
else
{
extremaLoc = Cv2.PointFromNormalized(new Point2f(1, 1));
Cv2.MinMaxLoc(image, out double _, out double maxVal, out Point2f _, out Point2f maxLoc);
Cv2.CornerSubPix(image, new[] { maxLoc }, new Size(3, 3), new Size(-1, -1), criteria);
extremaVal = maxVal;
extremaLoc = maxLoc;
}
return extremaLoc;
}
```
这个函数与原来的函数相比,主要做了以下几个优化:
1. 只使用了MinMaxLoc方法返回的极值位置,而没有使用极值本身,因此去掉了minLoc、maxLoc和extremaVal这些不必要的变量。
2. 在CornerSubPix方法中,只需要传入一个点坐标,而不需要传入一个数组,因此将new[] { extremaLoc }改为extremaLoc即可。
3. 在寻找最小值和最大值时,可以直接通过PointFromNormalized方法得到矩阵的左上角和右下角位置,而不需要使用minLoc和maxLoc变量。
4. 在寻找最小值和最大值时,只需要获取minVal或maxVal,而不需要获取另一个值,因此将不需要的变量赋值为下划线。
这样的优化可以使代码更加简洁明了,提高代码的可读性和可维护性。
阅读全文