opencv最小二乘拟合直线并在图像上绘画C++
时间: 2024-03-09 15:46:45 浏览: 93
在 OpenCV 中,可以使用 `cv::fitLine` 函数来进行最小二乘拟合直线,并使用 `cv::line` 函数在图像上绘制出拟合直线。具体实现如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 加载图像
Mat image = imread("test.jpg", IMREAD_COLOR);
// 构造数据点
std::vector<Point2f> points;
points.emplace_back(50, 50);
points.emplace_back(100, 150);
points.emplace_back(150, 250);
points.emplace_back(200, 350);
points.emplace_back(250, 450);
// 计算拟合直线
Vec4f lineParams; // 存储直线参数
fitLine(points, lineParams, cv::DIST_L2, 0, 0.01, 0.01);
// 在图像上绘制直线
Point2f startPoint, endPoint;
startPoint.x = lineParams[2] - 100 * lineParams[0];
startPoint.y = lineParams[3] - 100 * lineParams[1];
endPoint.x = lineParams[2] + 100 * lineParams[0];
endPoint.y = lineParams[3] + 100 * lineParams[1];
line(image, startPoint, endPoint, Scalar(0, 0, 255), 2);
// 显示图像
imshow("image", image);
waitKey(0);
return 0;
}
```
在上面的代码中,`image` 是一个 `Mat` 类型的图像,表示待绘制直线的图像。`points` 是一个 `std::vector<Point2f>` 类型的数据,表示待拟合的点集。`fitLine` 函数的参数和上面的代码相同。`line` 函数的参数依次为:
- `image`: 待绘制直线的图像
- `startPoint`: 直线的起点,是一个 `Point2f` 类型的点。
- `endPoint`: 直线的终点,是一个 `Point2f` 类型的点。
- `Scalar(0, 0, 255)`: 直线的颜色,这里使用红色。
- `2`: 直线的粗细,这里使用 2。
最后,函数会显示图像,并等待用户按下任意键才会退出。
阅读全文