【图像处理】Hough直线变换

C C++最全13- OpenCV:霍夫检测:直线、圆检测_opencv 霍夫检测,【架构师必备】 Double mindist, // 10 最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8 Double param1, // canny edge detection low threshold。(2)前提条件 – 边缘检测已经完成 (cv::Canny,输入的是8位的图像可以是单通道或多通道,输出的是8位单通道的灰度图像,再通过threshold转化为二值化图像)CV_PI/180 int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线。 阅读详情

(I)直线篇

1 直线是如何表示的?
对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法。然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线。其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角。如下图所示。

hough变换是如何检测出直线和圆的? - 钰央 - 计算机视觉·图像处理
2 如果坐标系中有多个点,又怎样识别出哪些点在一条直线上呢?
使用hough变换来检测直线的思想就是:为每一个点假设n个方向的直线,通常n=180,此时检测的直线的角度精度为1°,分别计算这n条直线的(r,theta)坐标,得到n个坐标点。如果要判断的点共有N个,最终得到的(r,theta)坐标有N*n个。有关这N*n个(r,theta)坐标,其中theta是离散的角度,共有180个取值。
最重要的地方来了,如果多个点在一条直线上,那么必有这多个点在theta=某个值theta_i时,这多个点的r近似相等于r_i。也就是说这多个点都在直线(r_i,theta_i)上。
3 下面拿个例子说明: 
如果空间中有3个点,如何判断这三个点在不在一个直线上,如果在,这条直线是的位置为?
hough变换是如何检测出直线和圆的? - 钰央 - 计算机视觉·图像处理
 这个例子中,对于每个点均求过该点的6条直线的(r,theta)坐标,共求了3*6个(r,theta)坐标。可以发现在theta=60时,三个点的r都近似为80.7,由此可判定这三个点都在直线(80.7,60)上。
通过 r0theta 坐标系可以更直观表示这种关系,如下图:图中三个点的(r,theta)曲线汇集在一起,该交点就是同时经过这三个点的直线。 
hough变换是如何检测出直线和圆的? - 钰央 - 计算机视觉·图像处理

在实际的直线检测情况中,如果超过一定数目的点拥有相同的(r,theta)坐标,那么就可以判定此处有一条直线。在r0theta 坐标系图中,明显的交汇点就标示一条检测出的直线。
如下图,可以判定出平面上的点共构成了两条直线,即检测出两条直线。

hough变换是如何检测出直线和圆的? - 钰央 - 计算机视觉·图像处理
4 代码:(该代码只能检测二值图像,非二值图像必须与处理)
  1. IplImage *pGrayImage = cvLoadImage("C:\\Users\\徐图之\\Desktop\\source.bmp", -1);
  2. IplImage *pCannyImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 1);
  3. cvCanny(pGrayImage, pCannyImage, 30, 90);
  4. cvSmooth(pCannyImage, pCannyImage);
  5. // 线段检测(只能针对二值图像)
  6. CvMemStorage *pcvMStorage = cvCreateMemStorage();
  7. double fRho = 1;
  8. double fTheta = CV_PI / 180;
  9. int nMaxLineNumber = 50; //最多检测条直线
  10. double fMinLineLen = 150; //最小线段长度
  11. double fMinLineGap = 10; //最小线段间隔
  12. CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap);
  13. // 绘制线段
  14. IplImage *pColorImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 3);
  15. cvCvtColor(pCannyImage, pColorImage, CV_GRAY2BGR);
  16. for (int i = 0; i < pcvSeqLines->total; i++)
  17. {
  18. CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines, i);
  19. cvLine(pColorImage, line[0], line[1], CV_RGB(255, 0, 0), 2);
  20. }
  21. cvNamedWindow("pstrWindowsSrcTitle", CV_WINDOW_AUTOSIZE);
  22. cvShowImage("pstrWindowsSrcTitle", pGrayImage);
  23. cvNamedWindow("pstrWindowsLineName", CV_WINDOW_AUTOSIZE);
  24. cvShowImage("pstrWindowsLineName", pColorImage);
  25. cvWaitKey(0);
  26. cvReleaseMemStorage(&pcvMStorage);
  27. cvDestroyWindow("pstrWindowsSrcTitle");
  28. cvDestroyWindow("pstrWindowsLineName");
  29. cvReleaseImage(&pGrayImage);
  30. cvReleaseImage(&pCannyImage);
  31. cvReleaseImage(&pColorImage);

效果图:
 

5,opencv函数参数讲解:
函数功能:检测图像中的线段
函数原型:
CvSeq* cvHoughLines2(
  CvArr* image,
  void* line_storage,
  int method,
  double rho,
  double theta,
  int threshold,
  double param1=0, double param2=0
);
参数说明:
第一个参数表示输入图像,必须为二值图像(黑白图)。
第二个参数表示存储容器,和上一篇的轮廓检测一样,可以传入CvMemStorage类型的指针。
第三个参数表示变换变量,可以取下面的值:
  CV_HOUGH_STANDARD - 传统或标准 Hough 变换. 每一个线段由两个浮点数 (ρ, θ) 表示,其中 ρ 是线段与原点 (0,0) 之间的距离,θ 线段与 x-轴之间的夹角。
  CV_HOUGH_PROBABILISTIC - 概率 Hough 变换(如果图像包含一些长的线性分割,则效率更高)。它返回线段分割而不是整个线段。每个分割用起点和终点来表示。
  CV_HOUGH_MULTI_SCALE - 传统 Hough 变换的多尺度变种。线段的编码方式与 CV_HOUGH_STANDARD 的一致。
第四个参数表示与象素相关单位的距离精度。
第五个参数表示弧度测量的角度精度。
第六个参数表示检测线段的最大条数,如果已经检测这么多条线段,函数返回。
第七个参数与第三个参数有关,其意义如下:
  对传统 Hough 变换,不使用(0).
  对概率 Hough 变换,它是最小线段长度.
  对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).
第八个参数与第三个参数有关,其意义如下:
  对传统 Hough 变换,不使用 (0).
  对概率 Hough 变换,这个参数表示在同一条线段上进行碎线段连接的最大间隔值(gap), 即当同一条线段上的两条碎线段之间的间隔小于param2时,将其合二为一。
  对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2).
直线检测-Radon变换、Hough变换 radon函数对应格式包括:[R,xp] = radon(I,theta); 其中,R为线积分值,xp为径向坐标,theta为投影角度; 图像投影,就是说将图像在某一方向上做线性积分(累加求和)。如果将图像看成二维函数f(x, y),则其投影就是在特定方向上的线性积分,比如f(x, y)在垂直方向上的线性积分就是其在x轴上的投影;f(x, y)在水平方向上的线积分就是其在y轴上的投影。通过这些投影,可以获取图像在指定方向上的突出特性,这在图像模式识别等处理中可能会用到。 Radon(拉东)算... 阅读详情

相关推荐

Hough变换原理-直线检测

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。 import cv2 def HoughLinesP_demo(img_path): img = cv2.imread(img_path) org = img.copy() img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 阈值计算 ret, img = cv2.threshold(img, ..

xian0710830114的专栏 1万+

Hough检测直线原理及c++代码

(I)直线篇 1 直线是如何表示的? 对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法。然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线。其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角。如下图所示。 2 如果坐标系中有多个点,又怎样识别出哪些点在一条直线上呢? 使用hough变换来检测直线的思想就是:

s12244315的博客 1万+

图像处理:Hough变换原理分析

别看Hough变换似乎简单,但是,不发挥一下数学理论的功力是不可能理解的;本人早十几年前就用Hough,也一直想写Hough变换,但一懒就是10几年,乘春节前有空,就将Hough的详细细节揭秘出来,供大家参考。

gongdiwudu的专栏 1万+

霍夫变换检测直线原理及C/C++实现

霍夫变换检测直线的原理及C/C++实现 霍夫变换原理概述 霍夫直线检测原理 直线检测算法的流程及代码实现 霍夫变换原理概述 在图像处理中,霍夫变换是经典算法之一,常被用来检测图像中的直线,圆等特征图形。本节将讨论霍夫变换的理论基础。 1、基础理论 假设有一个样本集合 {(xi,yj)}\{(x_i,y_j)\}{(xi​,yj​)} 我们想从这个样本集合中提取出符合一定条件的子集(称为目标集合) {(xi,yj)∣f(x,y)=s}\{(x_i,y_j)|f(x,y)=s\}{(xi​,yj​)∣f(

weixin_42415539的博客 7913

数字图像处理(实践篇)六 利用hough变换进行直线检测

数字图像处理(实践篇)六 利用hough变换进行直线检测

静谧、淡雅 8683

图像处理之Hough变换检测直线

霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。由RichardDuda和PeterHart在公元1972年发明,并称之为广义霍夫变换(generalizedHoughtransform),广义霍夫变换和更早前1962年的PaulHough的专利有关。

weixin_42491648的博客 2534

C++ opencv概率霍夫变换(HoughLinesP)直线检测

标准和概率霍夫线变换

JiangTao2333的博客 1万+

【C++】OpenCV直线检测示例程序 by浅墨

浅墨出品,零资源分下载,分享精神至上~ 图片素材是极具现代风格的建筑,很大气~ 我们用滑动条来控制阈值参数,利用OpenCV中的霍夫变换动态进行直线检测,得到不同效果的直线检测图。 程序的核心函数为HoughLinesP。 博文《【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑》的配套详细注释源代码。 博文链接: http://blog.youkuaiyun.com/poem_qianmo/article/details/26977557 1.已将dll打包到Release文件夹下,运行Release文件夹中的exe可以直接看到运行结果. 2.源代码运行需要进行OpenCV+VS开发环境的配置。可以参看我写的配置博文: http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337 3.编写环境:Visual Studio 2010 4.写作当前代码时配套使用的OpenCV版本: 2.4.9 5.推荐代码结合博文一起看,学习效果更佳。 by @浅墨_毛星云

OpenCv-C++-小案例实战-直线检测(以及霍夫直线检测代码)

对于一份试卷,我现在需要检测到填空题上面的横线。如下图: 很多人第一反应是霍夫直线检测,包括我也是想到用霍夫直线检测。然而事实并不尽如人意。 因为在我的博客中并没有放上霍夫直线检测这一部分,所以,我用霍夫直线算法来检测试卷上的横线。 霍夫直线检测: #include&lt;opencv2/opencv.hpp&gt; #include&lt;iostream&gt; #include&lt;ma...

Daker_Huang的博客 4777

C++语言Hough变换直线检测

用HOUGH变换的思想,在变换域里面对直线的斜率和截距进行检测,从而检测出直线的信息。

【电商风控】电商风控标注是什么

本篇文章给大家谈谈。

866

小白学习图像处理7——Hough变换检测直线

文章目录一、Hough变换的原理1、过定点的直线方程2、两点确定一条直线3、方程的形式二、实现过程三、程序代码 一、Hough变换的原理 1、过定点的直线方程   在 xoy 平面给定一个点P(xi, yi),则过点P的一条直线可以用表示为(直线x = C 除外): yi=axi+b y_{i} = ax_{i}+b yi​=axi​+b   过点P的直线有无数条,它们构成一个集和,参数a、b满足...

我有两颗糖 3661

6轴机械臂(拟人臂+球形腕(三轴相交于一点))正逆运动学求解

1、DH坐标下机械臂参数 theta=[pi/10,pi/2,pi/4,-pi/4,pi/4,-pi/8];%关节角度 a=[0, 0.260, 0.025, 0, 0, 0];%连杆长度 d=[0, 0, 0, 0.280, 0, 0.072];%偏移距离 alpha=[pi/2, 0, pi/2, -pi/2 , pi/2, 0];%RBR型6轴机械臂 使用...

qq_33374294的博客 7881

MATLAB Hough变换提取直线代码:图像处理利器

MATLAB Hough变换提取直线代码:图像处理利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在图像处理领域,提取图像中的直线是一种常见需求。MATLAB Hough变换提取直线代码,正是为了满足这一需求而诞生。本项目提供了一个基于MATLAB语言的代码,通过Hough变换算法,用户可以轻松提取图像中的直线,并直观显示效果。 项目技术分析 Hough变换简介 ...

gitblog_06780的博客 857

ANSYS Workbench瞬态结构分析(1)时域分析

本文围绕瞬态结构分析展开。首先阐释其概念与理论基础,涵盖控制方程及数值求解方法。接着详述在 ANSYS Workbench 中进行瞬态分析的操作流程,以音叉为例,介绍从创建分析系统、材料定义、几何处理与网格划分,到边界条件与载荷设置、求解器设置及结果后处理的各步骤。之后对分析结果进行探讨,并针对计算不收敛、计算时间过长等常见问题给出调试技巧,旨在为读者提供全面的瞬态结构分析知识与实践指导。

qq_58675332的博客 6527

四自由度机械臂Matlab仿真全流程:从DH参数建模到轨迹规划实战

本文详细介绍了四自由度机械臂在Matlab中的完整仿真流程,从DH参数建模到轨迹规划实战。通过Robotics Toolbox工具,读者可以学习如何构建机械臂模型、验证运动学特性,并实现平滑的轨迹规划。文章还提供了性能优化技巧和常见问题解决方案,帮助开发者高效完成机械臂仿真项目。

weixin_29061041的博客 238

python图像处理初探——基于hough变换的直线道路识别

暑期实习的工作是基于遥感地图的道路识别工作,在前期的论文调研过程中,基于自己的水平选择了复现 hough变换的方法,也算是直线处理的经典算法。重要的是,复习了数字图像处理的各种流程 1.引库 opencv库进行图像的处理 numpy库进行多维数组的处理 import cv2 import numpy as np 2.基本图像处理 (以下的过程不一定都要用到,我只是顺便都复习了一下) image = cv2.imread('road1.png') 图像锐化 kernel2 = np.array([[0,

Style_Wei_的博客 1467

五、MT8168 音频驱动之SPEAKER

本章主要讲解MT8168平台的内部SPEAKER驱动配置。分为HP接法和LINE OUT接法。2.1.3 audio_custom_exp.h设置。2.1.4 mixer_paths.xml设置。2.2.3 mixer_paths.xml设置。2.1.2 ProjectConfig 设置。2.2.2 ProjectConfig 设置。2.2.1 deconfig设置。2.1.1 DTS设置。......

Joon2020的博客 1664

【图像处理】hough变换_检测直线

hough变换 原型 cv2.HoughLines() dst: 输出图像. 它应该是个灰度图 (但事实上是个二值化图) lines: 储存着检测到的直线的参数对 (r,\theta) 的容器 rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素. theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180) thresho...

一路嵌行的博客 1031

基于STM32L4XX、HAL库的STS40-CD1B-R3温度传感器 驱动程序设计

/ HAL库需要左移一位。// 每2秒读取一次。// 等待测量完成 - 高精度模式大约需要15ms。// 执行软复位确保传感器处于已知状态。温度测量范围:-40°C ~ +125°C。湿度测量范围:0% ~ 100% RH。// 复位后需要等待至少1ms。// 初始化STS40传感器。// 读取温湿度数据。// 转换原始数据为实际值。// 发送读取序列号命令。// 读取序列号数据。湿度精度:±1.5% RH。

zhusl6688的博客 287

IPCP(IP Control Protocol,IP控制协议)

IPCP(IP Control Protocol,IP控制协议)

天赐好车的博客 754

用c语言实现检测直线,图像处理 C语言 hough变换 检测直线

一天从网上下了20个vc的hough代码,没有一个代码是成功的。令人郁闷,我参考matlab代码写出了hough检测单个直线的程序Hough变换:本程序是我花费时间最长的程序;参考matlab算法;首先求出原图上的每一个像素在变换域上的对应曲线,即原图上每一点(i,j)对应变换域曲线(p,k);p=(int)(i*cos(pi*k/180)+j*sin(pi*k/180))(0然后遍历(i,j),...

weixin_42469649的博客 821

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2761

直线检测 c语言,图像处理 C语言 hough变换 检测直线

一天从网上下了20个vc的hough代码,没有一个代码是成功的。令人郁闷,我参考matlab代码写出了hough检测单个直线的程序Hough变换:本程序是我花费时间最长的程序;参考matlab算法;首先求出原图上的每一个像素在变换域上的对应曲线,即原图上每一点(i,j)对应变换域曲线(p,k);p=(int)(i*cos(pi*k/180)+j*sin(pi*k/180))(0然后遍历(i,j),...

weixin_36103691的博客 347

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

小白学习图像处理8——使用matlab的hough变换函数

文章目录一、hough 函数1、语法2、举个栗子二、houghpeaks函数1、语法2、举个栗子三、houghlines函数1、语法2、举个栗子四、绘制线段 一、hough 函数 1、语法 [H,theta,rho] = hough(BW) [H,theta,rho] = hough(BW,Name,Value,...) 详细说明: [H,theta,rho] = hough(BW) 计算二值...

我有两颗糖 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

史上最详细的Hough直线检测

之前写过检测车道线的文章:https://blog.youkuaiyun.com/u010712012/article/details/84780943 最后可以检测出两条车道线,但是,本课题的目的是通过提供一张图片,经过图像处理操作,经过算法模型得到违章的车辆情况,所以不能有人为的因素。 所以这里再次回顾一下检测直线的算法之——Hough变换。 Hough直线检测 1.直线坐标参数空间 在图像x−y坐标空间...

IT荻的博客 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 【图像处理】CvArr、Mat、CvMat、IplImage、BYTE转换
下一篇: 【C++笔记】如何判断2个线段相交
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值