OpenCV学习笔记-直线拟合

Hough 变换可以提取图像中的直线。但是提取的直线的精度不高。而很多场合下,我们需要精确的估计直线的参数,这时就需要进行直线拟合。

直线拟合的方法很多,比如一元线性回归就是一种最简单的直线拟合方法。但是这种方法不适合用于提取图像中的直线。因为这种算法假设每个数据点的X 坐标是准确的,Y 坐标是带有高斯噪声的。可实际上,图像中的每个数据点的XY 坐标都是带有噪声的。

下面就来讲讲适用于提取图像中直线的 直线拟合算法
直线拟合算法在链接的博客里讲的很清楚了,所以我只研究一下代码。

OpenCV提供的直线拟合函数如下:
fitLine(points, distType, param, reps, aeps, line=None)

distType 指定拟合函数的类型,可以取 CV_DIST_L2、CV_DIST_L1、CV_DIST_L12、CV_DIST_FAIR、CV_DIST_WELSCH、CV_DIST_HUBER。

param 就是 CV_DIST_FAIR、CV_DIST_WELSCH、CV_DIST_HUBER 公式中的C。如果取 0,则程序自动选取合适的值。

reps 表示直线到原点距离的精度,建议取 0.01。
aeps 表示直线角度的精度,建议取 0.01。

ρ

返回值有四个 vx, vy, x, y 前两个是直线的方向向量,后两个是直线上一个点的坐标。

ρ(r)=2(1+r22







#直线拟合
rows, cols = img.shape[:2]
[vx, vy, x, y] = cv.fitLine(contour, cv.DIST_L2, 0, 0.01, 0.01)
'''
fitLine(points, distType, param, reps, aeps, line=None)
'''
left_y = int((-x*vy/vx) + y)
right_y = int(((cols-x)*vy/vx) + y)
cv.line(img, (cols-1, right_y), (0, left_y), (0, 255, 0), 2)









猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80469819