霍夫变换是一种在图像中寻找直线、圆及其他简单形状的方法,霍夫线变换是利用Hough变换在二值图像中找到直线。

利用CV_HOUGH_PROBABILISTIC,对应PPHT(累计概率霍夫变换)?这个算法的具体实现有待深究!!!

----------------------------------------------------------------------------------------------------

霍夫线变换的函数为:

HoughLines

利用 Hough 变换在二值图像中找到直线

CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold, double param1=0, double param2=0 );
image
输入 8-比特、单通道 (二值) 图像,当用CV_HOUGH_PROBABILISTIC方法检测的时候其内容会被函数改变
line_storage
检测到的线段存储仓. 可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的线段。如果 line_storage 是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(对于标准hough变换,线段按照长度降序输出).
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
与象素相关单位的距离精度
theta
弧度测量的角度精度
threshold
阈值参数。如果相应的累计值大于 threshold, 则函数返回的这个线段.
param1
第一个方法相关的参数:

  • 对传统 Hough 变换,不使用(0).
  • 对概率 Hough 变换,它是最小线段长度.
  • 对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).
param2
第二个方法相关参数:

  • 对传统 Hough 变换,不使用 (0).
  • 对概率 Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一。
  • 对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2).

函数 cvHoughLines2 实现了用于线段检测的不同 Hough 变换方法. Example. 用 Hough transform 检测线段

----------------------------------------------------------------------------------------------------

/*code*/

程序中用到了cvCvtColor色彩空间转换,将输入图像从一个色彩空间转换为另外一个色彩空间,Canny处理的是单通道图像,然后转换为三通道图像再使用Hough变换。

  1. #include <highgui.h>
  2. #include <cv.h>
  3. #include <math.h>
  4. int main(int argc, char** argv)
  5. {
  6. IplImage* src;
  7. src = cvLoadImage( argv[1], 0 ); //加载灰度图
  8. IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );
  9. IplImage* color_dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 3 );  //创建三通道图像
  10. CvMemStorage* storage = cvCreateMemStorage(0);
  11. CvSeq* lines = 0;
  12. cvCanny( src, dst, 50, 100, 3 );  //首先运行边缘检测,结果以灰度图显示(只有边缘)
  13. cvCvtColor( dst, color_dst, CV_GRAY2BGR ); //色彩空间转换,将dst转换到另外一个色彩空间即3通道图像
  14. lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 ); //直接得到直线序列
  15. //循环直线序列
  16. for( int i = 0; i < lines ->total; i++ )  //lines存储的是直线
  17. {
  18. CvPoint* line = ( CvPoint* )cvGetSeqElem( lines, i );  //lines序列里面存储的是像素点坐标
  19. cvLine( color_dst, line[0], line[1], CV_RGB( 0, 255, 0 ) );  //将找到的直线标记为红色
  20. //color_dst是三通道图像用来存直线图像
  21. }
  22. cvNamedWindow( "src", 1 );
  23. cvShowImage( "src", src );
  24. cvNamedWindow( "Hough", 1 );
  25. cvShowImage( "Hough", color_dst );
  26. cvWaitKey(0);
  27. return 0;
  28. }

----------------------------------------------------------------------------------------------------
/*result*/

src

Hough line

由图看出,用绿色线条勾画的是Canny轮廓检测后再用Hough线变换得到的所有直线。

图像变换 - 霍夫线变换(cvHoughLines2)的更多相关文章

  1. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  2. 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  3. python数字图像处理(15):霍夫线变换

    在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中 ...

  4. 学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换

    在本篇文章中,我们将一起学习opencv中霍夫变换相关的知识点,以及了解opencv中实现霍夫变换的HoughLines,HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles ...

  5. opencv —— HoughLines、HoughLinesP 霍夫线变换原理(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)及直线检测

    霍夫线变换的原理 一条直线在图像二维空间可由两个变量表示,有以下两种情况: ① 在笛卡尔坐标系中:可由参数斜率和截距(k,b)表示. ② 在极坐标系中:可由参数极经和极角(r,θ)表示. 对于霍夫线变 ...

  6. OpenCV中的霍夫线变换和霍夫圆变换

    一.霍夫线变换 霍夫线变换是OpenCv中一种寻找直线的方法,输入图像为边缘二值图. 原理: 一条直线在图像二维空间可由两个变量表示, 例如: 1.在 笛卡尔坐标系: 可由参数: (m,b) 斜率和截 ...

  7. OpenCV-Python 霍夫线变换 | 三十二

    目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...

  8. OpenCV 霍夫线变换

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...

  9. opencv之霍夫曼变换

    霍夫变换不仅可以找出图片中的直线,也可以找出圆,椭圆,三角形等等,只要你能定义出直线方程,圆形的方程等等. 不得不说,现在网上的各种博客质量真的不行,网上一堆文章,乱TM瞎写,误人子弟.本身自己就没有 ...

随机推荐

  1. C# WPF Bing地图展示

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 内容目录 实现效果 业务场景 编码实现 本文参考 源码下载 1.实现效果 Bi ...

  2. nvm,nrm和yarn

    nvm Node Version Management nvm list 查看所有已安装的 node 版本 nvm install 版本号 安装指定版本的 node nvm use 版本号 切换到指定 ...

  3. LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA

    非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...

  4. 问题 C: 神奇的口袋

    #include <cstdio> using namespace std; int n1; int nums[99]; int help(int i, int sum) { if (su ...

  5. Python标准库之logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  6. splice删除元素后返回的是一个数组

    let arr = [51,68,98,78];let result = arr.splice(1,1);//[68]let arr2 = [51,68,98,78];let result2 = ar ...

  7. 在阿里云IIS服务器上安装证书

    在IIS服务器上安装证书 您可将下载的阿里云SSL证书安装到IIS服务器上,使您的IIS服务器支持HTTPS安全访问. 一.前提条件 申请证书时需要选择 系统自动创建CSR. 申请证书时如果选择手动创 ...

  8. Linux的常用命令---这是对Linux最基本的尊重

    Linux: 诞生日期:1991年 开发者:林纳斯·托瓦茨 特点:免费,开源 发行版本:centos|red Hat|Ubuntu|红旗等 思想:一切都是文件 重要文件目录 bin:二进制文件(命令) ...

  9. Appium学习1-安装

    Appium简介 Appium 是一个开源的.跨平台的测试框架,可以用来测试 Native App.混合应用.移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具.App ...

  10. 小I的小姐姐

    小 I 的小姐姐 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣 ...