iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解在Python中使用OpenCV进行直线检测
  • 230
分享到

详解在Python中使用OpenCV进行直线检测

2024-04-02 19:04:59 230人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 引言2. 霍夫变换3. 举个栗子3.1 读入图像 进行灰度化3.2 执行边缘检测3.3 进行霍夫变换补充1. 引言 在图像处理中,直线检测是一种常见的算法,它通常获取n个边

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 cv2
import numpy as np

def 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 result

if __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直线检测内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解在Python中使用OpenCV进行直线检测

本文链接: https://www.lsjlt.com/news/140977.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解在Python中使用OpenCV进行直线检测
    目录1. 引言2. 霍夫变换3. 举个栗子3.1 读入图像 进行灰度化3.2 执行边缘检测3.3 进行霍夫变换补充1. 引言 在图像处理中,直线检测是一种常见的算法,它通常获取n个边...
    99+
    2022-11-13
  • 在Python中如何使用OpenCV进行直线检测
    这篇文章主要介绍了在Python中如何使用OpenCV进行直线检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在Python中如何使用OpenCV进行直线检测文章都会有所收获,下面我们一起来看看吧。1. 引言...
    99+
    2023-06-29
  • Python下opencv使用hough变换检测直线与圆
    在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具。 Hough变换的...
    99+
    2022-11-12
  • 详解使用Python+Pycaret进行异常检测
    目录概述介绍为什么是PyCaret学习目标PyCaret安装数据导入探索性异常检测分析Swarm图箱形图散点图异常检测模型创建隔离森林局部异常因子K最近邻比较模型中的异常解释和可视化...
    99+
    2022-11-13
  • 如何在python中使用OpenCV检测人脸
    这期内容当中小编将会给大家带来有关如何在python中使用OpenCV检测人脸,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相...
    99+
    2023-06-14
  • 怎么在python中利用opencv实现一个车道线检测功能
    这篇文章将为大家详细讲解有关怎么在python中利用opencv实现一个车道线检测功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现思路:canny边缘检测获取图中的边缘信息;2、霍夫变...
    99+
    2023-06-06
  • 使用Python中OpenCV和深度学习进行全面嵌套边缘检测
    这篇博客将介绍如何使用OpenCV和深度学习应用全面嵌套的边缘检测。并将对图像和视频流应用全面嵌套边缘检测,然后将结果与OpenCV的标准Canny边缘检测器进行比较。 1. 效果图...
    99+
    2022-11-12
  • Android如何使用GestureDetector进行手势检测详解
    目录1.引言2.进行手势检测2.1 创建GestureDetector2.2 与onTouchEvent结合使用2.3 GestureDetector.OnGestureListen...
    99+
    2022-11-13
  • 如何在python中使用opencv实现一个颜色检测功能
    本文章向大家介绍如何在python中使用opencv实现一个颜色检测功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络...
    99+
    2023-06-06
  • Python如何使用opencv进行手势识别详解
    目录前言原理程序部分附另一个手势识别实例总结前言 本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等。 原理 首先...
    99+
    2022-11-12
  • 在python中使用nvidia的VPF库对RTSP流进行硬解码并使用opencv进行显示
    解码并处理视频流的多线程应用 随着视频处理技术的不断发展,越来越多的应用需要对视频流进行解码和处理。在本文中,我们将介绍一个基于Python的多线程应用程序,该应用程序可以解码并处理多个RTSP视频流,同时利用GPU加速,以提高处理速度。...
    99+
    2023-09-08
    python opencv vpf RTSP硬解码 gpu解码
  • 如何在Python中使用NumPy进行线性代数计算?
    Python是一种功能强大的编程语言,它拥有许多开源库,其中NumPy是一个广泛使用的库,它为Python提供了高效的数学函数和数组操作。在本文中,我们将探讨如何在Python中使用NumPy进行线性代数计算。 一、安装NumPy库 在使用...
    99+
    2023-08-28
    path numy numpy
  • 如何在Python中妥善使用进度条详解
    目录1 简介2 tqdm常用方法2.1 基础用法2.2 配合jupyter notebook/jupyter lab的美观进度条2.3 配合pandas中的apply3 alive-...
    99+
    2022-11-13
  • 详解Python 使用 selenium 进行自动化测试或者协助日常工作
    Python 使用 selenium 进行自动化测试 或者协助日常工作,内容如下所示: 1、基础准备 需要准备 Python 环境 需要安装 selenium 模块...
    99+
    2022-11-12
  • 在arcgis使用python脚本进行字段计算时是如何解决中文问题的
    一、引言   在arcgis打开一个图层的属性表,可以对属性表的某个字段进行计算,但是在平常一般都是使用arcgis提供的字段计算器的界面进行傻瓜式的简答的赋值操作,并没有使用到脚本对字段值进行逻辑的操作。...
    99+
    2022-06-04
    字段 如何解决 中文
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作