没有Polynomial方法请优化 public static void SubPixelLine(Mat image, Point2f start, Point2f end, out Point2d edgePoint, int length = 5) { int n = (int)Math.Ceiling(length / 2.0); double[] xValues = new double[length]; for (int i = 0; i < length; i++) { xValues[i] = i - n + start.X; } double[] yValues = new double[length]; for (int i = 0; i < length; i++) { Point2f p = new Point2f((float)xValues[i], start.Y); Cv2.Remap(image, new Mat(), InputArray.Create(new[] { p }), new Mat(),); yValues[i] = image.At<byte>(0, (int)p.X); } Polynomial polyfit = new Polynomial(xValues, yValues, length - 1); double[] coeffs = polyfit.Coefficients; edgePoint = new Point2d(-coeffs[1] / coeffs[0], start.Y); }生成新的函数
时间: 2024-01-22 17:02:17 浏览: 128
可以使用线性回归方法对直线进行拟合。具体实现步骤如下:
1. 定义一个二维数组,用于存储所有的样本数据。每个样本数据包含两个特征值,分别为 x 坐标和 y 坐标。在这个问题中,可以将 x 坐标设置为 xValues 数组中的元素,y 坐标设置为 yValues 数组中的元素。
2. 定义一个一维数组,用于存储所有的标签数据。在这个问题中,可以将标签设置为 yValues 数组中的元素。
3. 使用线性回归算法对样本数据进行拟合,得到模型的参数。
4. 使用模型的参数计算出直线的斜率和截距。
5. 根据直线的斜率和截距,计算出直线与 x 轴的交点,即为直线的边缘点。
下面是代码实现:
```
public static void SubPixelLine(Mat image, Point2f start, Point2f end, out Point2d edgePoint, int length = 5)
{
int n = (int)Math.Ceiling(length / 2.0);
double[] xValues = new double[length];
for (int i = 0; i < length; i++)
{
xValues[i] = i - n + start.X;
}
double[] yValues = new double[length];
for (int i = 0; i < length; i++)
{
Point2f p = new Point2f((float)xValues[i], start.Y);
Cv2.Remap(image, new Mat(), InputArray.Create(new[] { p }), new Mat(),);
yValues[i] = image.At<byte>(0, (int)p.X);
}
// 定义样本数据数组和标签数组
double[][] data = new double[xValues.Length][];
double[] labels = new double[yValues.Length];
for (int i = 0; i < xValues.Length; i++)
{
data[i] = new double[] { xValues[i], yValues[i] };
labels[i] = yValues[i];
}
// 使用线性回归算法拟合数据
var linearRegression = new LinearRegression();
linearRegression.Learn(data, labels);
// 获取模型的参数
double[] parameters = linearRegression.Weights;
// 计算直线的斜率和截距
double slope = parameters[0];
double intercept = parameters[1];
// 计算直线与 x 轴的交点
double x = -intercept / slope;
edgePoint = new Point2d(x, start.Y);
}
```
阅读全文