OpenCV fitline直线拟合函数学习

下图是OpenCV官方文档中,对直线拟合函数的详细介绍:

fitLine()函数用于,对二维或三维空间中的点集进行直线拟合。共有六个参数:

param 1:输入的点集,可以是Mat或者vector<>,可以是二维点集或三维点集。

例如:

vector<Point> points;

param 2:拟合结果,即一条直线。在二维空间中,直线可以定义为

Vec4f line;

在二维平面中,(line[0],line[1])表示直线的方向向量,(line[2],line[3])表示直线上的一个点。 

param 3:拟合算法,CV_DIST_L2为最简单快速的最小二乘法,推荐使用。

定义在源文件中的枚举类型:

 1 //! Distance types for Distance Transform and M-estimators
 2 enum { DIST_USER = -1, // User defined distance
 3 DIST_L1 = 1, // distance = |x1-x2| + |y1-y2|
 4 DIST_L2 = 2, // the simple euclidean distance
 5 DIST_C = 3, // distance = max(|x1-x2|,|y1-y2|)
 6 DIST_L12 = 4, // L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
 7 DIST_FAIR = 5, // distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998
 8 DIST_WELSCH = 6, // distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846
 9 DIST_HUBER = 7 // distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345
10 };
View Code

官方文档中介绍,这里使用的拟合算法是M-estimator方法。

 

param 4: 拟合算法中参数C的值,设为0,则自动选用最优值。

param 5 & param 6: 官方推荐使用0.01。

 

转载于:https://www.cnblogs.com/TongWee/p/4830587.html

### 轮廓检测直线拟合OpenCV 中,轮廓检测通常涉及使用 `findContours` 函数来提取图像中的轮廓。一旦获得了这些轮廓点,就可以应用 `cv::fitLine` 函数来进行直线拟合。 #### 使用最小二乘法进行直线拟合 为了执行此操作,首先需要加载一幅图像并对它进行预处理以便更容易找到边缘和轮廓。下面展示了一个完整的流程,包括读取图像、灰度转换、阈值化以及最终的轮廓检测和直线拟合过程[^3]: ```cpp #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { // 加载图片并转为灰度图 Mat src = imread("image.jpg", IMREAD_COLOR); Mat gray, edges; cvtColor(src, gray, COLOR_BGR2GRAY); // 应用Canny算子获取边缘 Canny(gray, edges, 50, 150, 3); // 查找所有外部轮廓 vector<vector<Point>> contours; findContours(edges, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 创建一个窗口用于显示结果 namedWindow("Detected Lines", WINDOW_AUTOSIZE); // 遍历每一个轮廓尝试拟合成一条线 for (size_t i = 0; i < contours.size(); ++i){ Vec4f lineParams; // 对当前轮廓做直线拟合 fitLine(contours[i], lineParams, DIST_L2, 0, 0.01, 0.01); float vx = lineParams[0]; float vy = lineParams[1]; Point pt1(lineParams[2],lineParams[3]); // 计算线上两个端点的位置 double scale = sqrt(pow(src.cols, 2) + pow(src.rows, 2)); Point pt2(static_cast<int>(pt1.x + scale * vx), static_cast<int>(pt1.y + scale * vy)); // 绘制拟合后的线条到原图上 line(src, pt1, pt2, Scalar(0, 255, 0), 2); } imshow("Detected Lines", src); waitKey(); } ``` 这段代码展示了如何从输入图像中识别物体边界,并基于那些边界的坐标集合运用最小二乘算法寻找最佳匹配的直线。通过调整参数如距离测量方式(`DIST_L2`)和其他精度控制选项,可以获得更精确的结果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值