用opencv和C++实现最小二乘法直线拟合
时间: 2023-06-10 11:06:40 浏览: 181
最小二乘法直线拟合是一种经典的图像处理算法,可以用于从图像中提取直线信息。下面是用 OpenCV 和 C 语言实现最小二乘法直线拟合的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_bgr;
cvtColor(img, img_bgr, COLOR_GRAY2BGR);
vector<Point> points;
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
if (img.at<uchar>(i, j) > 200) {
points.push_back(Point(j, i));
}
}
}
Vec4f line;
fitLine(points, line, DIST_L2, 0, 0.01, 0.01);
float k = line[1] / line[0];
float b = line[3] - k * line[2];
Point pt1(0, b);
Point pt2(img.cols - 1, k * (img.cols - 1) + b);
line(img_bgr, pt1, pt2, Scalar(0, 0, 255), 2);
namedWindow("line fitting", WINDOW_NORMAL);
imshow("line fitting", img_bgr);
waitKey(0);
return 0;
}
```
上面的代码中,首先读入一张灰度图像,然后遍历每个像素点,将其坐标加入到一个 vector 中。使用 `fitLine` 函数来拟合直线,得到直线的参数向量 `line`,其中 `[0]` 和 `[1]` 是直线的方向向量,`[2]` 和 `[3]` 是直线上的一点坐标。最后计算出直线的斜率和截距,根据这两个参数绘制拟合的直线。
注意,这里使用的是 `fitLine` 函数,而不是最小二乘法算法。但是实现的过程类似,都是通过最小化误差来拟合直线。
阅读全文