一、寻找非零像素的位置
- 在OpenCvSharp中,你可以使用FindNonZero方法来寻找非零(即1)像素的位置,然后通过遍历这些点来找到最大y值中的最小x值。
- 使用下面方法,传入一个二值图像,它会返回一个点,这个点表示在二值图像中1的最大y值中有一个对应的最小x值的坐标。
如果图像中没有1,则返回的点的坐标将是整数的最大值。
二、程序
using OpenCvSharp;
public Point GetMinXAtMaxY(Mat binaryImage)
{
// 确保输入图像是二值图像
if (binaryImage.Type() != MatType.CV_8UC1)
throw new ArgumentException("Input image must be a binary image.");
// 寻找所有非零像素的位置
KeyPoint[] nonZeroLocations = Cv2.FindNonZero(binaryImage);
// 初始化最终点
Point minPoint = new Point(int.MaxValue, 0);
// 遍历非零像素
foreach (var location in nonZeroLocations)
{
// 如果当前点的y值比目前最大的y值还要大,则不需要继续比较x值
if (location.Point.Y > minPoint.Y)
break;
// 如果当前点的y值与目前最大y值相同,且当前点的x值小于目前记录的x值,则更新目前的点
if (location.Point.Y == minPoint.Y && location.Point.X < minPoint.X)
minPoint = location.Point;
// 如果当前点的y值比目前记录的y值大,则更新目前的点
if (location.Point.Y > minPoint.Y)
minPoint = location.Point;
}
// 返回最小x值中最大y值的点
return minPoint;
}