Java opencv Point 取线性回归线
时间: 2023-06-28 18:05:31 浏览: 207
要取得线性回归线,首先需要进行线性回归。在 OpenCV 中,可以使用 `Core.polyfit()` 方法进行线性回归。该方法将返回一个包含斜率和截距的向量,可以将其用于创建回归线。
例如,假设有一个名为 `points` 的 `MatOfPoint2f` 对象,其中包含线性数据点。可以使用以下代码进行线性回归并创建回归线:
```
// 进行线性回归
MatOfPoint2f points = new MatOfPoint2f();
double[] regression = Core.polyfit(points, 1, true);
// 创建回归线
Point pt1 = new Point(0, regression[1]);
Point pt2 = new Point(points.width(), regression[1] + regression[0] * points.width());
```
在这里,我们将 `polyfit()` 方法的 `degree` 参数设置为 `1`,表示进行一次多项式拟合,即线性回归。`true` 参数表示将返回标准化后的参数。然后,我们使用返回的斜率和截距值创建 `Point` 对象,以便绘制回归线。
请注意,这只是一个示例,并且需要根据您的具体应用进行修改。
相关问题
Java opencv HoughLinesP 取线性回归线
在使用OpenCV的HoughLinesP函数检测出直线后,可以使用线性回归方法来拟合这些离散的直线点,得到一条最优的直线。
具体步骤如下:
1. 首先将HoughLinesP检测出的直线点坐标按照x或y坐标排序,得到一个坐标序列。
2. 通过线性回归方法,计算出这个序列的最优拟合直线的斜率k和截距b。
3. 根据斜率k和截距b,可以得到最优拟合直线方程为: y = kx + b。
4. 最后,可以使用这个方程来绘制拟合直线。
下面是一个Java代码示例:
```
// 将HoughLinesP检测出的直线点按照x坐标排序
Arrays.sort(lines, (a, b) -> Double.compare(a[0], b[0]));
// 构造一个二维数组,每一行存储一个直线点的x和y坐标
double[][] data = new double[lines.length][2];
for (int i = 0; i < lines.length; i++) {
data[i][0] = lines[i][0];
data[i][1] = lines[i][1];
}
// 使用线性回归方法,计算最优拟合直线的斜率k和截距b
SimpleRegression regression = new SimpleRegression();
regression.addData(data);
double k = regression.getSlope();
double b = regression.getIntercept();
// 绘制最优拟合直线
Imgproc.line(image, new Point(0, b), new Point(image.width(), k * image.width() + b), new Scalar(0, 0, 255), 2);
```
其中,lines是HoughLinesP检测出的直线点数组,每个元素是一个长度为4的数组,存储了直线的起点和终点的x和y坐标。image是原始图像,在这里用于绘制拟合直线。
Java opencv ArrayList<Point> 线性回归拟合直线
要实现线性回归拟合直线,需要使用OpenCV中的cv::fitLine函数。该函数的参数中需要传入一个由Point类型组成的ArrayList,表示一组点集。使用该函数可以得到一条直线的斜率和截距,进而求出直线方程。
下面是一个Java代码示例:
```java
import org.opencv.core.Point;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
public class LinearRegression {
public static void main(String[] args) {
// 构造点集
ArrayList<Point> points = new ArrayList<>();
points.add(new Point(1, 2));
points.add(new Point(2, 4));
points.add(new Point(3, 6));
points.add(new Point(4, 8));
// 线性回归拟合直线
double[] lineParams = new double[4];
Imgproc.fitLine(new MatOfPoint2f(points.toArray(new Point[0])), lineParams, Imgproc.DIST_L2, 0, 0.01, 0.01);
// 输出直线方程
double k = lineParams[1] / lineParams[0];
double b = lineParams[3] - k * lineParams[2];
System.out.println("y = " + k + "x + " + b);
}
}
```
在上述代码中,我们首先构造了一个点集,然后使用cv::fitLine函数进行线性回归拟合直线。最后根据拟合结果计算出直线方程。注意,这里使用的是MatOfPoint2f类型,而不是ArrayList<Point>,需要进行转换。
阅读全文