public Point2f FindExtremePoint(Mat<float> image, bool white2black) { const double maxVal = 255.0; const MinMaxLocResult searchDirection = white2black ? MinMaxLocRresult.Min : MinMaxLocResult.Max; if (image == null) { throw new ArgumentNullException(nameof(image)); } Point minLoc, maxLoc; double minVal, maxVal; Cv2.MinMaxLoc(image, out minVal, out maxVal, out minLoc, out maxLoc, image); return searchDirection == MinMaxLocResult.Min ? minLoc : maxLoc; } 返回亚像素点,请优化代码,生成新的函数
时间: 2024-01-23 17:04:02 浏览: 213
要返回亚像素点,可以使用OpenCV的minMaxLoc函数的另一个重载,该重载返回一个带有亚像素精度的最小值/最大值和其对应的坐标。然后,可以使用cornerSubPix函数对找到的角点进行亚像素级别的精确化。另外,也可以将const double maxVal = 255.0; 改为 const float maxVal = 255f;,这样可以避免不必要的类型转换。下面是生成新函数的优化代码:
```
public Point2f FindSubPixelExtremePoint(Mat<float> image, bool white2black)
{
const float maxVal = 255f;
const MinMaxLocResult searchDirection = white2black ? MinMaxLocResult.Min : MinMaxLocResult.Max;
if (image == null)
{
throw new ArgumentNullException(nameof(image));
}
Point2f minLoc, maxLoc;
double minVal, maxVal;
Cv2.MinMaxLoc(image, out minVal, out maxVal, out minLoc, out maxLoc);
var criteria = new TermCriteria(TermCriteria.Eps | TermCriteria.Count, 20, 0.03);
Cv2.CornerSubPix(image, new[] { minLoc, maxLoc }, new Size(3, 3), new Size(-1, -1), criteria);
return searchDirection == MinMaxLocResult.Min ? minLoc : maxLoc;
}
```
这个版本的代码在搜索边缘点时,只搜索了一次,同时也进行了亚像素级别的精确化。
阅读全文