OpenCV中的cv2.fitline函数详解

一、cv2.fitline是什么

cv2.fitline函数是OpenCV中的一个较为重要的函数,它可以通过拟合一条直线,对图像中的一些边缘或轮廓进行线性拟合。在图像分析和处理的许多领域中都会用到这个函数,例如斑点检测、物体跟踪等。

cv2.fitline函数的具体用法为:

cv2.fitline(points, distType, param, reps, aeps)

其中,points代表的是二维点集,distType是拟合线时所使用的距离类型,param表示该距离类型的额外参数,reps是随机样本取样时的次数,aeps表示拟合线的精度。

二、使用cv2.fitline实现线性拟合

通过cv2.fitline函数可以对图像中的边缘或轮廓进行线性拟合,以便于后续的分析和处理。下面我们通过一个实例来展示如何使用cv2.fitline函数实现线性拟合。

首先我们准备一个二值化图像,用于展示该函数的作用。具体的实现代码如下所示:

import cv2
import numpy as np 

img = np.zeros((512,512,1), np.uint8)
cv2.rectangle(img, (100,100), (300,250), (255,255,255), 3)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

接下来我们对这个图像中的直线进行线性拟合,具体实现代码如下所示:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for line in lines:
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imshow('houghlines3',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

紧接着,我们可以使用cv2.fitline函数对得到的直线进行线性拟合,具体实现代码如下所示:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for line in lines:
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
    [vx,vy,x,y] = cv2.fitLine(lines[0], cv2.DIST_L2,0,0.01,0.01)
    lefty = int((-x*vy/vx) + y)
    righty = int(((cols-x)*vy/vx)+y)
    cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)
cv2.imshow('fitline',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

我们可以看到,在经过拟合的直线上,出现了两个绿色的点,它们分别代表了直线的起点和终点。

三、参数详解

cv2.fitline函数中所涉及的参数对于线性拟合的效果有着非常重要的影响。下面我们对参数进行详细的说明。

a. points参数

points参数是cv2.fitline函数中用于放置二维点集的参数,该参数是一个(N * 2)的NumPy数组,其中每一行表示二维空间中一个点的坐标,N表示样本点的个数。需要注意的是,该参数必须具有单精度或双精度浮点类型。

b. distType参数

distType参数是拟合线时使用的距离类型,在cv2.fitline函数中可以指定为以下几种值:

  • cv2.DIST_L2:表示欧几里得距离(L2范数)
  • cv2.DIST_L1:表示曼哈顿距离(L1范数)
  • cv2.DIST_L12:表示L1-L2混合距离(设置参数的方式如下所示:cv2.DIST_L12(0.5))
  • cv2.DIST_FAIR:表示矫正后的Fair距离(设置参数的方式如下所示:cv2.DIST_FAIR(0.5))
  • cv2.DIST_WELSCH:表示矫正后的Welsch距离(设置参数的方式如下所示:cv2.DIST_WELSCH(0.5))

c. param参数

param参数表示distType所对应的额外参数,对于鲁棒估计距离或某些混合距离类型,该参数是必须设置的。如果没有设置该参数,cv2.fitline函数将以0作为默认值进行计算。该参数的类型必须是浮点型。

d. reps参数

reps参数是随机样本取样的次数。当计算分量时,cv2.fitline函数会从给定的二维点集中随机提取reps组点并计算拟合直线。默认值是2。

e. aeps参数

aeps通常表示拟合的精度,但实际上是一个与误差范围有关的阈值。当两点之间的垂足距离小于aeps时,该点被认为是与拟合直线“吻合”的点。默认值是0.01。

四、cv2.fitline的实际应用场景

cv2.fitline函数在图像分析和处理的许多领域中都有着广泛的应用。例如,它可以用于:

  • 斑点检测:当斑点呈线状的时候,使用cv2.fitline函数可以得到斑点的长度和方向。
  • 物体跟踪:当物体呈线状的时候,使用cv2.fitline函数可以得到物体的速度和方向。
  • 边缘检测:cv2.fitline可以用于提取边缘的方向和长度。
  • 运动估计:利用cv2.fitline可以估计图像中物体的运动方向和速度。

五、总结

本文对OpenCV中cv2.fitline函数进行了比较详细的讲解。简单来说,cv2.fitline可以通过拟合一条直线,对图像中的一些边缘或轮廓进行线性拟合。在图像分析和处理的许多领域中都会用到这个函数。除此之外,本文还介绍了cv2.fitline函数的具体用法、参数详解以及实际应用场景等内容。

原创文章,作者:KOIC,如若转载,请注明出处:https://www.506064.com/n/138162.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
KOICKOIC
上一篇 2024-10-04 00:19
下一篇 2024-10-04 00:19

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29

发表回复

登录后才能评论