在Python中如何使用OpenCV进行直线检测
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍了在Python中如何使用OpenCV进行直线检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在Python中如何使用OpenCV进行直线检测文章都会有
千家信息网最后更新 2025年11月07日在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安全错误
数据库的锁怎样保障安全
济南市电化教育馆软件开发服务
怎么挖掘数据库
服务器制作绩效考核
hp服务器进bios
二是网络安全是
网络安全法规定 从事危害
软件开发bug率
网络安全保险理赔案例
互联网侧服务器产品
网络安全猜谜语
网络安全面包屑
公共厕所效果图软件开发
面试网络安全岗
互联网科技开锁公司
特朗普解雇网络安全局长
免费网络安全模式
网络安全十大漏洞课
衡水微信软件开发团队
江苏特种网络技术服务标准
讯虎网络技术
小程序部署需要数据库么
城阳区微信小程序软件开发
泰安数据库有国有企业吗
怎么落实网络安全法
网络安全培训 税务
互联网科技开锁公司
三亚路尚客互联网科技有限公司
为什么有数据库最左优先原则
如何获得上级网络服务器ip
php数据库文件在哪里