python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)
相比C++而言,Python适合做原型。本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处。这篇文章介绍在Python中使用OpenCV的霍夫变换检测直线。
提示:
转载请详细注明原作者及出处,谢谢!
本文介绍在OpenCV-Python中使用霍夫变换检测直线的方法。
本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识。笔者推荐清华大学出版社的《图像处理与计算机视觉算法及应用(第2版)
》。
霍夫变换
Hough变换是经典的检测直线的算法。其最初用来检测图像中的直线,同时也可以将其扩展,以用来检测图像中简单的结构。
OpenCV提供了两种用于直线检测的Hough变换形式。其中基本的版本是cv2.HoughLines。其输入一幅含有点集的二值图(由非0像素表示),其中一些点互相联系组成直线。通常这是通过如Canny算子获得的一幅边缘图像。cv2.HoughLines函数输出的是[float, float]形式的ndarray,其中每个值表示检测到的线(ρ , θ)中浮点点值的参数。下面的例子首先使用Canny算子获得图像边缘,然后使用Hough变换检测直线。其中HoughLines函数的参数3和4对应直线搜索的步长。在本例中,函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线。最后一个参数是经过某一点曲线的数量的阈值,超过这个阈值,就表示这个交点所代表的参数对(rho,
theta)在原图像中为一条直线。具体理论可参考这篇文章。
#coding=utf-8
import cv2
import numpy as np
img = cv2.imread("/home/sunny/workspace/images/road.jpg", 0)
img = cv2.GaussianBlur(img,(3,3),0)
edges = cv2.Canny(img, 50, 150, apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,118) #这里对最后一个参数使用了经验型的值
result = img.copy()
for line in lines[0]:
rho = line[0] #第一个元素是距离rho
theta= line[1] #第二个元素是角度theta
print rho
print theta
if (theta < (np.pi/4. )) or (theta > (3.*np.pi/4.0)): #垂直直线
#该直线与第一行的交点
pt1 = (int(rho/np.cos(theta)),0)
#该直线与最后一行的焦点
pt2 = (int((rho-result.shape[0]*np.sin(theta))/np.cos(theta)),result.shape[0])
#绘制一条白线
cv2.line( result, pt1, pt2, (255))
else: #水平直线
# 该直线与第一列的交点
pt1 = (0,int(rho/np.sin(theta)))
#该直线与最后一列的交点
pt2 = (result.shape[1], int((rho-result.shape[1]*np.cos(theta))/np.sin(theta)))
#绘制一条直线
cv2.line(result, pt1, pt2, (255), 1)
cv2.imshow('Canny', edges )
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下:
注意:
在C++中,HoughLines函数得到的结果是一个向量lines,其中的元素是由两个元素组成的子向量(rho, theta),所以lines的访问方式类似二维数组。因此,可以以类似:
std::vector<:vec2f>::const_iterator it= lines.begin();
float rho= (*it)[0];
float theta= (*it)[1];
这样的方式访问rho和theta。
而在Python中,返回的是一个三维的np.ndarray!。可通过检验HoughLines返回的lines的ndim属性得到。如:
lines = cv2.HoughLines(edges,1,np.pi/180,118)
print lines.ndim
#将得到3至于为什么是三维的,这和NumPy中ndarray的属性有关(关于NumPy的相关内容,请移步至NumPy简明教程),如果将HoughLines检测到的的结果输出,就一目了然了:#上面例子中检测到的lines的数据
3 #lines.ndim属性
(1, 5, 2) #lines.shape属性
#lines[0]
[[ 4.20000000e+01 2.14675498e+00]
[ 4.50000000e+01 2.14675498e+00]
[ 3.50000000e+01 2.16420817e+00]
[ 1.49000000e+02 1.60570288e+00]
[ 2.24000000e+02 1.74532920e-01]]
===============
#lines本身
[[[ 4.20000000e+01 2.14675498e+00]
[ 4.50000000e+01 2.14675498e+00]
[ 3.50000000e+01 2.16420817e+00]
[ 1.49000000e+02 1.60570288e+00]
[ 2.24000000e+02 1.74532920e-01]]]
概率霍夫变换
观察前面的例子得到的结果图片,其中Hough变换看起来就像在图像中查找对齐的边界像素点集合。但这样会在一些情况下导致虚假检测,如像素偶然对齐或多条直线穿过同样的对齐像素造成的多重检测。
要避免这样的问题,并检测图像中分段的直线(而不是贯穿整个图像的直线),就诞生了Hough变化的改进版,即概率Hough变换(Probabilistic Hough)。在OpenCV中用函数cv::HoughLinesP 实现。如下:
#coding=utf-8
import cv2
import numpy as np
img = cv2.imread("/home/sunny/workspace/images/road.jpg")
img = cv2.GaussianBlur(img,(3,3),0)
edges = cv2.Canny(img, 50, 150, apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,118)
result = img.copy()
#经验参数
minLineLength = 200
maxLineGap = 15
lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()结果如下:
未完待续。。。
参考资料:
1、《Opencv2 Computer Vision Application Programming Cookbook》
2、《OpenCV References Manule》
如果觉得本文写的还可以的话,请轻点“顶”,您的支持是我写下去的动力之一。未完待续。。。如有错误请指正,本人会虚心接受并改正!谢谢!
python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)相关推荐
- python仿真智能驾驶_opencv+python智能车道检测,助力无人驾驶
近年来,基于人工智能的车道检测算法得到了广泛的研讨.与传统的基于特征的方法相比,许多方法表现出了优越的功能.但是,当使用具有应战性的图像时,其准确率通常仍在低80%或高90%之间,甚至更低. 准确牢靠 ...
- opencv检测相交点_OpenCV学习笔记(八) 边缘、线与圆的检测
边缘检测 对图像进行边缘检测之前,一般都需要先进行降噪(可调用GaussianBlur函数). Sobel算子 与 Scharr算子 都是一个离散微分算子 (discrete differentiat ...
- java 直线交点_[Java教程]谈谈求线段交点的几种算法(js实现,完整版)
[Java教程]谈谈求线段交点的几种算法(js实现,完整版) 0 2014-08-27 10:05:22 "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面 ...
- python车牌字符分割_OpenCV+Python识别车牌和字符分割的实现
本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...
- python制作七夕礼物_OpenCV+Python制作程序七夕(情人节)礼物
1. 按 不知不觉七夕就过去了! 如果有对象,祝早生贵子!没有对象,祝早结连理! (搞笑一下,祝大家幸福美满吧,嘿嘿嘿) 给大家准备了一份已经写好的代码,利用Python+OpenCV+OpenPyX ...
- python 答题卡识别_opencv+python机读卡识别整合版
稍微整理了一下这个系列的一二三四章,可能看着更舒服吧--这个系列的解决方案不止一种,调参的方法也是各种各样,反正能够满足需求就极好了 1.预处理 这次的机读卡识别项目来源暑期培训,主要包括内容一张手机 ...
- python opencv压缩图片_OpenCV Python 缩放图片
By 凌顺 2019年9月12日 本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 使用OpneCV的cv2.resize()函数对图片 ...
- python 答题卡识别_opencv+python机读卡识别(最终版)
本文是对之前编写的机读卡进行完善, 只记录相关代码,不介绍具体编写流程, 具体流程:opencv+python机读卡识别(进阶版) 完善相关机读卡的适配,记录相关调试函数以及使用方法. # -*- c ...
- python opencv 录制视频_OpenCV Python 录制视频
学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现了一点故障,那就是获取到的文件总是为0KB.经过一番查找,终于找到了解决办法. 调用摄像头 调用摄像头作为本实验的基础是 ...
- python腐蚀膨胀代码_OpenCV+python实现膨胀和腐蚀的示例
1,概念及原理: 膨胀(Dilating) (或) (1)将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积. (2)内核 B 有一个可定义的 锚点, 通常定义为内核中心点. (3)进 ...
最新文章
- GPT-3等三篇论文获NeurIPS 2020 最佳论文奖!华人一作获时间检验奖
- [C++基础]017_数据的存放
- 表扬几位积极的同学!
- Elasticsearch学习系列-搜索技术基本知识
- oa处理会签流程图_OA协同流程管理解决方案
- JDK源码分析(2)之 Array 相关
- 如何翻滚截屏_怎么进行滚动截屏
- vs2010使用教程c语言编程,VS2010的使用
- 机器学习视频推荐-绝对的通俗易懂(线性回归,逻辑回归,朴素贝叶斯分类器,K-近邻,SVM,决策树,随机森林,XGboost,k-means聚类)
- jQuery视频拍照插件
- 向日葵深度linux,完美使用向日葵远程软件
- Python原来有三大神器
- 简历 计算机二级技能描述,【技能证书】简历中职业技能的经典描述
- php 评论插件,织梦评论插件,dedecms评论插件
- js 获取某一年第多少天是周几
- 浅谈学校OA办公系统实施的必要性和可行性
- 【2022项目复盘】无位置传感器的无刷直流电机驱动设计
- 陆家嘴vs静安寺,谁站在魔都职场名媛鄙视链顶端?
- 6.Redis单线程为什么这么快?
- 10.2 自制操作系统: risc-v Supervisor寄存器sscratch/sepc/scause/stval/senvcfg