【OpenCV + Python】Hough 直线变换_python opencv houghlinesp-程序员宅基地

技术标签: Hough 直线变换  图像处理  opencv  

• 理解霍夫变换的概念
• 学习如何在一张图片中检测直线
• 学习函数:cv2.HoughLines(),cv2.HoughLinesP()

霍夫变换在检测各种形状的的技术中非常流行,如果你要检测的形状可以用数学表达式写出,你就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也可以使用。我们下面就看看如何使用霍夫变换检测直线。一条直线可以用数学表达式y = mx + c 或者ρ = x cosθ + y sinθ 表示。是从原点到直线的垂直距离,θ是直线的垂线与横轴顺时针方向的夹角(如果你使用的坐标系不同方向也可能不同,我是按OpenCV 使用的坐标系描述的)。如下图所示:在这里插入图片描述
在霍夫变换中我们常用公式:
ρ = xcosθ + ysinθ
θ是直线与水平线所成的角度(0~180°),确定了它们,也就确定一条直线了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图转自网址:https://www.cnblogs.com/hellcat/p/9896426.html#_label0
在这里插入图片描述

lines  =  cv2.HoughLines(edges,1,np.pi/180,200)

cv2.HoughLines(),它返回(ρ, θ)值的序列,ρ单位像素,θ单位弧度(lines: lines[i][0]为第i条直线的rho,lines[i][1]表示第i条直线的theta)。第一个参数,输入的图片是一个二进制图片,在使用hough变换之前,应用阈值或使用canny边缘检测。第二和第三个参数分别是ρ(rho:像素精度,一般设置为1;)和θ的精度(theta:角度精度,一般设置为CV_PI/180),第4个参数是阈值,指可以被认为是一个线条的最小计数值。由于计数值的多少取决于线上的点数(threshold:表示累计的像素达到多少才能形成直线),所以这代表了可以被识别为线的最小长度。

void HoughLinesP( InputArray image, OutputArray lines,
double rho, double theta, int threshold,
double minLineLength = 0, double maxLineGap = 0 );

lines:lines[i]为Vec4i类型,若令L=lines[i],则Point(L[0],L[1])为第一个点坐标,Point(L[2],L[3])为第二个点坐标
rho、theta及threshold解释同上
minLineLength:最小的线段长度,感觉与threshold意思差不多
maxLineGap:两条线的间隔如果小于这个值为一条线

实例( cv2.HoughLines):

import cv2
import numpy as np
def line_detecte(img):
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,100,150,apertureSize=3)
lines = cv2.HoughLines(edges,1,np.pi/180,178)
print(lines)
result_img = img.copy()
for line in lines:
rho,theta = line[0] # 第一个元素是距离rho
#theta = line[1] # 第二个元素是角度theta
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直线
# 该直线与第一行的交点
pt1 = (int(rho / np.cos(theta)), 0)
# 该直线与最后一行的焦点
pt2 = (int((rho - result_img.shape[0] * np.sin(theta)) / np.cos(theta)), result_img.shape[0])
# 绘制一条白线
cv2.line(result_img, pt1, pt2, (255),3)
else: # 水平直线
# 该直线与第一列的交点
pt1 = (0, int(rho / np.sin(theta)))
# 该直线与最后一列的交点
pt2 = (result_img.shape[1], int((rho - result_img.shape[1] * np.cos(theta)) / np.sin(theta)))
# 绘制一条直线
cv2.line(result_img, pt1, pt2, (255), 3)
cv2.namedWindow(“img”, 0)
cv2.namedWindow(“edges”, 0)
cv2.namedWindow(“result_img”, 0)
cv2.resizeWindow(“img”, 400, 480)
cv2.resizeWindow(“edges”, 400, 480)
cv2.resizeWindow(“result_img”, 400, 480)
cv2.imshow(“img”, img)
cv2.imshow(“edges”, edges)
cv2.imshow(“result_img”, result_img)

img=cv2.imread(‘6.jpg’,1)
line_detecte(img)
cv2.waitKey()

在这里插入图片描述

实例( cv2.HoughLinesP):
给出的结果是线段,可用来测距等应用

import cv2
import numpy as np


def line_detecte_poss(img):
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray,100,150,apertureSize=3)
    lines = cv2.HoughLinesP(edges,1,np.pi/180,250,5)
    print(lines)
    result_img = img.copy()
    for line in lines:
        x1,y1,x2,y2 = line[0]  # 第一个元素是距离rho
        #theta = line[1]  # 第二个元素是角度theta
        cv2.line(result_img, (x1,y1), (x2,y2), (255), 3)
        cv2.namedWindow("img", 0)
        cv2.namedWindow("edges", 0)
        cv2.namedWindow("result_img", 0)
        cv2.resizeWindow("img", 400, 480)
        cv2.resizeWindow("edges", 400, 480)
        cv2.resizeWindow("result_img", 400, 480)
        cv2.imshow("img", img)
        cv2.imshow("edges", edges)
        cv2.imshow("result_img", result_img)


img=cv2.imread('6.jpg',1)
line_detecte_poss(img)
cv2.waitKey()

在这里插入图片描述
步骤:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,100,150,apertureSize=3)

前两步之后进行检测直线。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhouzongzong/article/details/93767441

智能推荐

【原创】VMware安装没有引导的Ghost镜像,超级详细,步步讲解_ghost文件在vm不能引导-程序员宅基地

文章浏览阅读9.1k次,点赞6次,收藏29次。最近我的VMware群里遇到好几个下载了Win10 Ghost镜像但是放在VMware中没法安装的小伙伴,我决定出个博客教程帮助一下各位。前置准备VMware Workstation软件一个,能够给VMware引导的Windows PE 镜像一个,没法直接引导安装的Ghost的iso镜像一个1、新建虚拟机一定要选择自定义(高级),因为Win10一般都是UEFI引导,但是Ghost的Win10一般是BIOS引导,选错第一步就直接凉凉兼容性默认选择无法引导的Ghost镜像(由于镜_ghost文件在vm不能引导

关闭窗口的时候不弹出提示直接关闭_c++ window关机不提示-程序员宅基地

文章浏览阅读897次。 关闭窗口的时候不弹出提示直接关闭javascript:opener=null;window.close(); _c++ window关机不提示

RxJava系列1(简介)_rxjava是哪个公司开发的-程序员宅基地

文章浏览阅读1.5k次。提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了RxJava的魅力。它能帮助我们简化代码逻辑,提升代码可读性。这对于开发效率的提升、后期维护成本的降低帮助都是巨大的。个人预测RxJava一定是2016年的一个大趋势,所以也有打算将它引入到公司现有的项目中来,写这一系列的文章主要也是为了团队内部做技术分享。_rxjava是哪个公司开发的

linux下tar打包到windows下解压缩后中文文件名乱码 用zip 或者 rar_tar -cvf 打包后中文乱码-程序员宅基地

文章浏览阅读4.9k次。主要原因是WINDOWS与LINUX对文件系统字符集的处理方式是不相同的。zip和rar会记录字符集,自动转换,而tar不是跨平台解压缩的。比如 “中国.txt”,utf-8下编码是e4b8ade59bbd,tar里面记录的是e4b8ade59bbd.tar,然后gbk下中国不是e4b8ade59bbd,所以就是乱码了。1)对于.zip  linux下提供了zi_tar -cvf 打包后中文乱码

常用免费可商用字体_verdana是免费字体吗-程序员宅基地

文章浏览阅读1.6k次。宋体 “\5B8B\4F53”楷体 “\6977\4f53”颜体 “\989c\4f53”sans-serif更多免费商用字体 https://www.uisdc.com/200-models-free-commercial-fonts_verdana是免费字体吗

类加载的过程中,不同类加载器的加载路径测试_代码查看扩展类加载器加载路径-程序员宅基地

文章浏览阅读554次。我们知道JVM加载类的过程遵循“双亲委派机制”,每当JVM启动时,是通过一个ClassLoader来加载class文件的。ClassLoader有三个实现,分别是:BootstrapLoader,ExtClassLoader和AppClassLoader.三个类加载器的作用不同,所加载的class文件也不相同。下面我们通过代码实现查看三个类加载器分别所加载的class路径/** * * @author JJ_knows * */public class ClassLoaderTe_代码查看扩展类加载器加载路径

随便推点

Jupyter notebook远程访问服务器_服务器配置jupyter notebook-程序员宅基地

文章浏览阅读3.7w次,点赞11次,收藏48次。1.背景  一直苦恼于本地机器和服务器上都要配置一些机器学习方面的环境,今天花了点时间研究了下Jupter notebook远程访问服务器,所以记录一下。  有些步骤非必须,这里尽量写清楚,读者理解后自行决定如何安装,本文以非root用户安装。2.安装步骤(1)登录服务器(2)检查是否有安装jupyter notebook,终端输入jupyter notebook,如果报错就是没有啦,那么就要用下面_服务器配置jupyter notebook

Java算法面试题(002) 如何通过一次迭代找到LinkedList的中间元素_求一个未知的linkedlist的的中间值-程序员宅基地

文章浏览阅读2.4k次。Java和非Java程序员在电话面试中经常被问及如何仅一次遍历查找到LinkedList的中间元素。这个问题类似于检查回文或者计算阶乘,面试官有时也会要求编写代码。为了回答这个问题,候选人必须熟悉LinkedList数据结构,即在单LinkedList的情况下,链表的每个节点都包含数据和指针,它是下一个链表节点的地址,单链表的最后一个元素指向null。由于为了找到链表的中间元素,你需要找到LinkedList的长度,这需要对链表节点进行计数直到最后一个元素为止。让这个数据结构面试问题有趣的是,你需要在一次遍_求一个未知的linkedlist的的中间值

linux内核从菜鸟起步-程序员宅基地

文章浏览阅读216次。内核源码获取:https://www.kernel.org Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字 第一个组数字:目前发布的内核主版本。 第二个组数字:偶数表示稳定版本;奇数表示开发中版本。 第三个组数字:错误修补的次数。 软件包管理器..._system trap reset

手机适配 屏幕分辨率_854480-程序员宅基地

文章浏览阅读2.2k次。Android手机目前常见的分辨率1.1 手机常见分辨率:4:3VGA 640480 (Video Graphics Array)QVGA 320QVGA 320240 (Quarter VGA)HVGA 480320 (Half-size VGA)SVGA 800SVGA 800600 (Super VGA)5:3WVGA 800480 (Wide VGA)16:9FWVGA 85416:9FW..._854480

glibc 2.5升级2.7问题_linux glewinfo.c.o: undefined reference to symbol -程序员宅基地

文章浏览阅读2.8k次。项目在高版本linux版本编译,可执行文件放在低版本的服务器上跑出现问题,报错 undefined reference to `__isoc99_sscanf'原因是我们的程序中使用的某个库,如xxx.a, xxx.so是在高版本的glibc环境里面进行编译的。有2种解决方法:1. 升级我们的glibc到2.7版本2. 找到xxx.a 或 xxx.so,在我们的_linux glewinfo.c.o: undefined reference to symbol '__isoc99_sscanf@@glibc_2.

推荐文章

热门文章

相关标签