千家信息网

在Python中如何使用OpenCV进行直线检测

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了在Python中如何使用OpenCV进行直线检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在Python中如何使用OpenCV进行直线检测文章都会有
千家信息网最后更新 2026年11月01日在Python中如何使用OpenCV进行直线检测

这篇文章主要介绍了在Python中如何使用OpenCV进行直线检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在Python中如何使用OpenCV进行直线检测文章都会有所收获,下面我们一起来看看吧。

    1. 引言

    在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线。其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术。

    2. 霍夫变换

    霍夫变换是图像处理中的一种特征提取方法,可以识别图像中的几何形状。它将在参数空间内进行投票来决定其物体形状,通过检测累计结果找到一极大值所对应的解,利用此解即可得到一个符合特定形状的参数。

    在使用霍夫变换侦测直线前,须先利用边缘检测算法来减少图像的数据量、剔掉不相关的信息,保留图像中重要的结构特征。

    3. 举个栗子

    3.1 读入图像 进行灰度化

    首先我们读入样例测试图像,然后利用cvtColor()函数进行灰度化操作,样例代码如下:

    im = cv2.imread("./ladder.png")gray_img = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

    运行结果如下:

    上图中左侧为彩色原图,右侧为执行灰度化后的灰度图。

    3.2 执行边缘检测

    接着我们来利用边缘检测算法(Canny、Sobel、Laplacian等)来检测物体边缘,样例代码如下:

    canny = cv2.Canny(gray_img, 30, 150)

    运行结果如下:

    3.3 进行霍夫变换

    最后,我们使用霍夫变换来得出直线检测结果,样例代码如下:

    lines = cv2.HoughLines(canny, 1, np.pi / 180, 180)lines1 = lines[:, 0, :]for rho, theta in lines1[:]:    a = np.cos(theta)    b = np.sin(theta)    x0 = a * rho    y0 = b * rho    x1 = int(x0 + 3000 * (-b))    y1 = int(y0 + 3000 * (a))    x2 = int(x0 - 3000 * (-b))    y2 = int(y0 - 3000 * (a))    cv2.line(im, (x1, y1), (x2, y2), (0, 0, 255), 2)

    运行结果如下:

    可以看出,通过简单的几步操作,我们就可以很方便的检测出图像中的所有直线。

    补充

    当然Python利用OpenCV不仅能检测直线,还能检测出直线倾斜角度。下面是实现的核心代码

    import cv2import numpy as npdef line_detect(image):  # 将图片转换为HSV  hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)  # 设置阈值  lowera = np.array([0, 0, 221])  uppera = np.array([180, 30, 255])  mask1 = cv2.inRange(hsv, lowera, uppera)  kernel = np.ones((3, 3), np.uint8)  # 对得到的图像进行形态学操作(闭运算和开运算)  mask = cv2.morphologyEx(mask1, cv2.MORPH_CLOSE, kernel) #闭运算:表示先进行膨胀操作,再进行腐蚀操作  mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)  #开运算:表示的是先进行腐蚀,再进行膨胀操作  # 绘制轮廓  edges = cv2.Canny(mask, 50, 150, apertureSize=3)  # 显示图片  cv2.imshow("edges", edges)  # 检测白线  这里是设置检测直线的条件,可以去读一读HoughLinesP()函数,然后根据自己的要求设置检测条件  lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 40,minLineLength=10,maxLineGap=10)  print "lines=",lines  print "========================================================"  i=1  # 对通过霍夫变换得到的数据进行遍历  for line in lines:    # newlines1 = lines[:, 0, :]    print "line["+str(i-1)+"]=",line    x1,y1,x2,y2 = line[0]  #两点确定一条直线,这里就是通过遍历得到的两个点的数据 (x1,y1)(x2,y2)    cv2.line(image,(x1,y1),(x2,y2),(0,0,255),2)   #在原图上画线    # 转换为浮点数,计算斜率    x1 = float(x1)    x2 = float(x2)    y1 = float(y1)    y2 = float(y2)    print "x1=%s,x2=%s,y1=%s,y2=%s" % (x1, x2, y1, y2)    if x2 - x1 == 0:      print "直线是竖直的"      result=90    elif y2 - y1 == 0 :      print "直线是水平的"      result=0    else:      # 计算斜率      k = -(y2 - y1) / (x2 - x1)      # 求反正切,再将得到的弧度转换为度      result = np.arctan(k) * 57.29577      print "直线倾斜角度为:" + str(result) + "度"    i = i+1  #   显示最后的成果图  cv2.imshow("line_detect",image)  return resultif __name__ == '__main__':  # 读入图片  src = cv2.imread("lines/line6.jpg")  # 设置窗口大小  cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)  # 显示原始图片  cv2.imshow("input image", src)  # 调用函数  line_detect(src)  cv2.waitKey(0)

    关于"在Python中如何使用OpenCV进行直线检测"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"在Python中如何使用OpenCV进行直线检测"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

    检测 直线 图像 霍夫 变换 边缘 结果 代码 图片 灰度 运算 函数 形状 数据 知识 算法 运行 内容 原图 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云信互联网科技有限公司 涨乐互联网科技 易互联网科技有限公司 美国互联网黑科技 互联网公司会议桌创意科技软装饰 广州优美互联网科技 全球顶尖互联网科技公司 岳阳华臻互联网科技有限公司 注册互联网科技公司经营范围大全 科技赋能视角下互联网保险发展 中天科技中国工业互联网 2021世界互联网领先科技成果发布 广州智享互联网科技 科技信息时代互联网发展 科技和互联网行业的特点 互联网科技的前景 河南商务圈互联网科技有限公司 北京瑞云互联网科技有限公司 互联网的黑科技实验室 互联网科技快速发展优美句子 互联网科技图片 华服互联网科技怎么样 友谊互联网络科技 互联网金融科技委员会 互联网金融监管科技 港股科技和互联网 千方科技属于互联网企业吗 产业互联网科技服务公司 上海同邻互联网科技有限公司规模 互联网科技的前景
    0