1、Hough变换

Hough变换是一种快速的形状匹配技术。经典的H ough变换适用于曲线形状可以用参数来描述、而曲线位置未知情况下的曲线检测。如下:

在笛卡儿坐标系中, 直线可以用斜截方程y = kx + b 表示。考虑同一直线上的两点( x i, yi ) 和( xj, yj ), 满足yi = kx i+ b 和yj = kxj + b, 映射到参数空间后的两条正弦曲线Q=x i cos H+ yi sin H和Q= xj cos H+ yj s in H将相交于一点。如下图所示:

从而在图像空间中同一条直线上的所有点在变换到参数空间后的正弦曲线都将交汇于一点( Q, H)。因此可以设计二维计数器H ( Q, H) 来累加极坐标系中的参考点数。最后通过统计计数器矩阵的局部极大值, 即可检测出图像中的直线。

推广后的Hough变换可以检测任意形状。

2、OpenCV中利用Hough变换检测直线

/* Finds lines on binary image using one of several methods.
line_storage is either memory storage or 1 x <max number of lines> CvMat, its
number of columns is changed by the function.
method is one of CV_HOUGH_*;
rho, theta and threshold are used for each of those methods;
param1 ~ line length, param2 ~ line gap - for probabilistic,
param1 ~ srn, param2 ~ stn - for multi-scale */
CVAPI(CvSeq*)  cvHoughLines2( CvArr* image, void* line_storage, int method,
double rho, double theta, int threshold,
double param1 CV_DEFAULT(0), double param2 CV_DEFAULT(0));

参数说明:

  image

  输入8-比特、单通道(二值)图像,当用CV_HOUGH_PROBABILISTIC方法检测的时候其内容会被函数改变。

  line_storage

  检测到的线段存储仓.可以是内存存储仓(此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的线段。如果 line_storage 是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序).

  method

  Hough 变换变量,是下面变量的其中之一:

  CV_HOUGH_STANDARD - 传统或标准 Hough 变换. 每一个线段由两个浮点数 (ρ, θ) 表示,其中 ρ 是直线与原点(0,0) 之间的距离,θ 线段与 x-轴之间的夹角。因此,矩阵类型必须是 CV_32FC2 type.

  CV_HOUGH_PROBABILISTIC- 概率 Hough 变换(如果图像包含一些长的线性分割,则效率更高). 它返回线段分割而不是整个线段。每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是 CV_32SC4.

  CV_HOUGH_MULTI_SCALE - 传统 Hough 变换的多尺度变种。线段的编码方式与 CV_HOUGH_STANDARD 的一致。

  rho

  以象素为单位的距离精度,一般取1

  theta

  以弧度为单位角度精度,一般取CV_PI/180

  threshold

阈值参数。当在一条直线上的像素点数大于threshold时,才将该直线作为检测结果显示出来。该值越大,得到直线越少。

  param1

  对传统 Hough 变换,不使用(0).

  对概率Hough变换,它是最小线段长度.即当线段长度大于param1时,才将该线段作为检测结果显示。与上一参数类似,不过上一参数为像素数,而该参数为线段长度。

  对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).

  param2

  对传统 Hough 变换,不使用 (0).

  对概率 Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一条长直线。

  对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2).

注意:

(1)倾斜角的理解

标准hough变换中返回的line[1],我们知道其表示直线的倾斜角,但是为极坐标下的倾斜角,注意当theta = PI /2时,直线是水平的。

(2)选择不同形式的hough变换直线检测类型,line[0]和line[1]表示的意思是不同的。

这里两种形式的hough检测方法是通过函数cvHoughLines2的的参数method来区分的。method可以是CV_HOUGH_STANDRD ( 标hough)  和 CV_HOUGH_PROBABILISTIC(概率累积hough)

对于返回的每条直线 : float* line = ( float* ) cvGetSeqElem( lines,i)

在标准hough中:

line[ 0 ] 表示矢量长度(rho_x来表示), line[1]表示直线的倾斜角(theta_x来表示)

在概率hough变换中,line[0]  和line[1]表示返回直线的两个端点

示例代码如下:

#include<cv.h>
#include <highgui.h>
#include <math.h>
int main(void)
{
IplImage *src = cvLoadImage("1.jpg",1);
if (src)
{
IplImage *dst = cvCreateImage(cvGetSize(src),8,1);
IplImage *color_dst = cvCreateImage(cvGetSize(src),8,3);
CvMemStorage *storage = cvCreateMemStorage();
CvSeq *lines = 0;
int i ;
cvCanny(src,dst,50,200,3);
cvCvtColor(dst,color_dst,CV_GRAY2BGR);
#if 1
lines = cvHoughLines2(dst,storage,CV_HOUGH_STANDARD,1,CV_PI/180,40);
for (i=0;i<lines->total;i++)
{
float *line = (float *)cvGetSeqElem(lines,i);
float rho = line[0];
float theta = line[1];
CvPoint pt1,pt2;
double a = cos(theta);
double b = sin(theta);
if (fabs(a)<0.001)
{
pt1.x = pt2.x = cvRound(rho);
pt1.y = 0;
pt2.y = color_dst->height;
}
else if (fabs(b)<0.001)
{
pt1.y = pt2.y = cvRound(rho);
pt1.x = 0;
pt2.x = color_dst->width;
}
else
{
pt1.x = 0;
pt1.y = cvRound(rho/b);
pt2.x = cvRound(rho/a);
pt2.y = 0;
}
cvLine(color_dst,pt1,pt2,CV_RGB(255,0,0),1,8);
}
#else
lines = cvHoughLines2(dst,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,40);
for (i=0;i<lines->total;i++)
{
CvPoint *line = (CvPoint *)cvGetSeqElem(lines,i);
cvLine(color_dst,line[0],line[1],CV_RGB(255,0,0),1,CV_AA);
}
#endif
cvNamedWindow("Source");
cvShowImage("Source",src);
cvNamedWindow("Hough");
cvShowImage("Hough",color_dst);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&color_dst);
cvReleaseMemStorage(&storage);
cvDestroyAllWindows();
return 1;
}
}

Hough 检测直线相关推荐

  1. Hough Transform 霍夫变换检测直线

    Hough Transform 霍夫变换检测直线 从理论到代码,再从代码到理论 (1)理论之通俗理解: 1.在图像中检测直线的问题,其实质是找到构成直线的所有的像素点.那么问题就是从找到直线,变成找到 ...

  2. 【机器视觉学习笔记】Hough变换直线检测(C++)

    目录 源码 效果 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文源码摘自OpenCV2马拉松第22圈--Hough变换直线检测原理与实现 源 ...

  3. hough变换直线检测_CV学习笔记(十五):直线检测

    在这一篇文章中我们将学习使用OpenCV中的 HoughLines 函数和 HoughLinesP 函数来检测图像中的直线. 在这个函数中,使用的是霍夫变换(Hough Transform) 这是计算 ...

  4. Hough变换直线检测

    作者:云外阳光 链接:https://www.zhihu.com/question/35268803/answer/82100453 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

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

    文章目录 一.Hough变换的原理 1.过定点的直线方程 2.两点确定一条直线 3.方程的形式 二.实现过程 三.程序代码 1.程序片段 2.总程序 四.matlab 的hough函数 一.Hough ...

  6. Hough变换检测直线与圆的原理

    霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术,通过投票算法检测具有特定形状的物体.霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的 ...

  7. hough变换直线检测_python+opencv实现霍夫变换检测直线

    作者:Ruff_XY 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLi ...

  8. matlab哈夫点线对偶运算,数字图像处理—图像分割—哈夫(Hough)变换及哈夫变换原理—检测直线...

    1.检测直线 n个点在一条直线上,连续的满足直线方程:同样,离散的也满足直线方程. 直线解决方法:先确定所有有任意2点决定的直线(需约 次运算以确定n(n - 1)/ 2条线).在找出接近具体直线的点 ...

  9. opencv 检测直线、线段、圆、矩形

    转自:http://blog.csdn.net/byxdaz/archive/2009/12/01/4912136.aspx 检测直线:cvHoughLines,cvHoughLines2 检测圆:c ...

最新文章

  1. SQLAlchemy之SQL Expression
  2. 【arduino】arduino ISP下载程序方法,用arduino uno给M5 Module DC MOTOR下载程序
  3. linux grep 详细深入学习
  4. Java面向对象(12)--对象类型转换 (Casting )
  5. 人工智能AI实战100讲(二)-自动驾驶传感器之激光雷达(二)激光雷达配置车型介绍
  6. WDLINUX (Centos5.8) 安装 bcmath
  7. BDT在Mac(10.8.3)下找不到libfreetype.6.dylib
  8. java string 数据结构_java 数据结构(一):java常用类 一 String类
  9. node.js中npm包管理工具
  10. NHibernate 的 ID 标识选择器
  11. java虚拟机 什么语言_Java虚拟机是用什么语言写的?
  12. 了解H.264(AVC)的你,知不知道什么是SVC?
  13. hive支持update、delete
  14. 零基础学SQL(九、分组 GROUP BY)
  15. 对话苏宁张桂平 商协社团·万祥军:全国工商联谋民企凝聚力
  16. linux 虚拟机不是全屏显示,Linux系统在虚拟机VirtualBox不能全屏解决办法
  17. 破解苹果电脑开机密码
  18. Speedoffice(word)中如何清除文字的文本格式
  19. 为评职称!走捷径花钱发论文?骗你没商量!
  20. 计算机内,二进制小数的表示方法

热门文章

  1. Python学习前期准备---第九天
  2. 主流的Python领域和框架--转
  3. mybatis使用注解替代xml配置,动态生成Sql
  4. 当当网高可用架构之道--转
  5. A XSS filter for Java EE web apps--转载
  6. SimpleUrlHandlerMapping 处理器映射的配置--转
  7. 元宇宙iwemeta: 2021年云计算行业发展研究报告
  8. The Annotated Transformer
  9. 数据结构排序学习总结
  10. Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...