1. 统计概率霍夫线变换
  • 这是执行起来效率更高的霍夫线变换. 它输出检测到的直线的端点 
  • 在OpenCV 中它通过函数 HoughLinesP 来实现

代码

  1. 这个程序是用来做什么的?

    • 加载一幅图片
    • 对图片进行 标准霍夫线变换 或是 统计概率霍夫线变换.
    • 分别在两个窗口显示原图像和绘出检测到直线的图像.
  2. 我们将要说明的例程能从 这里 下载。 一个更高级的版本 (能同时演示标准霍夫线变换和统计概率霍夫线变换并带有活动条来改变变换的阈值) 能从 这里 下载。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace cv;
using namespace std;void help()
{cout << "\nThis program demonstrates line finding with the Hough transform.\n""Usage:\n""./houghlines <image_name>, Default is pic1.jpg\n" << endl;
}int main(int argc, char** argv)
{const char* filename = argc >= 2 ? argv[1] : "pic1.jpg";Mat src = imread(filename, 0);if(src.empty()){help();cout << "can not open " << filename << endl;return -1;}Mat dst, cdst;Canny(src, dst, 50, 200, 3);cvtColor(dst, cdst, CV_GRAY2BGR);#if 0
  vector<Vec2f> lines;
  HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );  for( size_t i = 0; i < lines.size(); i++ )
  {     float rho = lines[i][0], theta = lines[i][1];
     Point pt1, pt2;
     double a = cos(theta), b = sin(theta);
     double x0 = a*rho, y0 = b*rho;
     pt1.x = cvRound(x0 + 1000*(-b));
     pt1.y = cvRound(y0 + 1000*(a));
     pt2.x = cvRound(x0 - 1000*(-b));
     pt2.y = cvRound(y0 - 1000*(a));
     line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
  }
 #else
  vector<Vec4i> lines;
  HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
  for( size_t i = 0; i < lines.size(); i++ )
  {    Vec4i l = lines[i];
    line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
  }
 #endifimshow("source", src);imshow("detected lines", cdst);waitKey();return 0;
}

代码说明

  1. 加载图片

    Mat src = imread(filename, 0);
    if(src.empty())
    {help();cout << "can not open " << filename << endl;return -1;
    }
    

  2. 用Canny算子对图像进行边缘检测

    Canny(src, dst, 50, 200, 3);
    

    现在我们将要执行霍夫线变换. 我们将会说明怎样使用OpenCV的函数做到这一点:

  3. 标准霍夫线变换

    1. 首先, 你要执行变换:

      vector<Vec2f> lines;
      HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );
      

      带有以下自变量:

      • dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图)
      • lines: 储存着检测到的直线的参数对  的容器 * rho : 参数极径  以像素值为单位的分辨率. 我们使用 1 像素.
      • theta: 参数极角  以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
      • threshold: 要”检测” 一条直线所需最少的的曲线交点
      • srn and stn: 参数默认为0. 查缺OpenCV参考文献来获取更多信息.
    2. 通过画出检测到的直线来显示结果.

      for( size_t i = 0; i < lines.size(); i++ )
      {float rho = lines[i][0], theta = lines[i][1];Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a*rho, y0 = b*rho;pt1.x = cvRound(x0 + 1000*(-b));pt1.y = cvRound(y0 + 1000*(a));pt2.x = cvRound(x0 - 1000*(-b));pt2.y = cvRound(y0 - 1000*(a));line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
      }
      

  4. 统计概率霍夫线变换

    1. 首先, 你要执行变换:

      vector<Vec4i> lines;
      HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
      

      带有以下自变量:

      • dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图) * lines: 储存着检测到的直线的参数对  的容器
      • rho : 参数极径  以像素值为单位的分辨率. 我们使用 1 像素.
      • theta: 参数极角  以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
      • threshold: 要”检测” 一条直线所需最少的的曲线交点 * minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
      • maxLineGap: 能被认为在一条直线上的亮点的最大距离.
    2. 通过画出检测到的直线来显示结果.

      for( size_t i = 0; i < lines.size(); i++ )
      {Vec4i l = lines[i];line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
      }
      

  5. 显示原始图像和检测到的直线:

    imshow("source", src);
    imshow("detected lines", cdst);
    

  6. 等待用户按键推出程序

    waitKey();
    

结果

Note

得到的结果使用的是在上面 代码 部分提到的更高级版代码. 霍夫线变换的代码没有改变, 唯一不同的是在GUI的部分加入了活动条可动态改变阈值.输入图像为:

通过执行统计概率霍夫线变换我们能得到下面的结果:

当你使用滑动条来改变 阈值 的时候会观察到检测到线的数目的改变. 这是因为: 如果你设置了一个更大的阈值, 能检测到的线的数目将更少 (你需要更多的点来表示一条能检测到的直线).

HoughLinesP函数(概率检测直线)相关推荐

  1. OpenCV-Python教程(9)(10)(11): 使用霍夫变换检测直线 直方图均衡化 轮廓检测

    OpenCV-Python教程(9.使用霍夫变换检测直线) 相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同 ...

  2. python霍夫变换检测直线_OpenCV-Python教程(9、使用霍夫变换检测直线)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...

  3. 【车道线检测】霍夫变换(HoughLines)检测直线详解

    总结 霍夫变换是一种思想,用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲. 霍夫变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解, ...

  4. python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...

  5. 霍夫变换检测直线 c语言,opencv之霍夫变换直线检测

    霍夫变换检测 霍夫变换之直线检测霍夫变换直线检测 前提条件-边缘检测已经完成 平面空间到极坐标空间的转换(空间域向霍夫域的转换) 检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式 ...

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

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

  7. Hough 检测直线

    1.Hough变换 Hough变换是一种快速的形状匹配技术.经典的H ough变换适用于曲线形状可以用参数来描述.而曲线位置未知情况下的曲线检测.如下: 在笛卡儿坐标系中, 直线可以用斜截方程y = ...

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

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

  9. 霍夫直线检测python_python+opencv实现霍夫变换检测直线

    本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意: ...

最新文章

  1. R语言一键批量完成差异统计和可视化
  2. java B2B2C Springboot仿淘宝电子商城系统-负载均衡之ribbon+feign
  3. android:碎片的概念
  4. 做Web前端开发的你必须会这几点!
  5. 经验与教训:测试员的偏向
  6. DDD(领域驱动设计)系列之一-DomainPrimitive
  7. java tcp链接慢_jmeter tcp长连接性能测试
  8. 知识图谱研讨实录09丨肖仰华教授带你读懂知识图谱语言认知
  9. NYOJ水题--最短街区问题
  10. list 如何判空以及为什么
  11. 细数继承与派生(纯干货推荐)1.0
  12. 马哥python_马哥Python 开发9期
  13. 新浪微博开放平台使用
  14. 开源项目_C语言学生个人信息管理系统课程设计_chenjie的博客
  15. [宋史学习] 宋初对党项的征讨与妥协
  16. python连接S3
  17. 产品能力提升|《简约至上·交互式设计四策略》
  18. 即将发布的 Apache Spark 3.2 将内置 Pandas API
  19. hping3使用手册
  20. 一篇文章读懂《麦肯锡极简工作法》

热门文章

  1. python3命令记忆技巧_Python3学习笔记-回忆并复述是加强记忆的好方式!
  2. python sanic 向别的服务器发送post请求_Sanic框架请求与响应实例分析
  3. if,elif,else的关系 input print int的用法
  4. 请不要做浮躁的人——转给即将上路或者正在路上的程序员朋友
  5. linux命令:case选择结构语句
  6. 从OpenStack Newton发布看开源云计算
  7. Exchange 2016 先决条件
  8. Python 自带IDLE中调试程序
  9. oracle怎么将一列挪到另一列,详细讲解Oracle数据库的数据迁移方法
  10. 数据结构源码笔记(C语言):分块法查找