博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【OpenCV】直线检测
阅读量:6701 次
发布时间:2019-06-25

本文共 2092 字,大约阅读时间需要 6 分钟。

直线在图像中出现的频率非常之高,而直线作为图像的特征对于基本内容的图像分析有着很重要的作用,本文通过OpenCV中的hough变换来检测图像中的线条。

我们先看最基本的Hough变换函数HoughLines,它的原型如下:

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 );

它的输入是一个二值的轮廓图像,往往是边缘检测得到的结果图像;它的输出是一个包含多个Vec2f点的数组,数组中的每个元素是一个二元浮点数据 对<rou,theta>,rou代表直线离坐标原点的距离,theta代表角度。第3和第4个参数代表步长,因为Hough变换实际上是一 个穷举的算法,rho表示距离的步长,theta代表角度的步长。第5个参数是一个阈值设置直接的最低投票个数,知道Hough原理的,这个参数应该很容 易理解。

从 这个函数的输出结果我们可以看出,得到的直线并没有指定在图像中的开始点与结束点,需要我们自己去计算,如果我们想把直接显示在图像中就会比较麻烦,而且 会有很多角度接近的直线,其实它们是重复的,为了解决上面这些问题,OpenCV又提供了一个函数HoughLinesP()。它的输出是一个 Vector of Vec4i。Vector每一个元素代表一条直线,是由一个4元浮点数组构成,前两个点一组,后两个点一组,代表了在图像中直线的起始和结束点。

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

解释一下最后两个参数,minLineLength指定了检测直线中的最小宽度,如果低于最小宽度则舍弃掉,maxLineGap指定通过同一点的直线,如果距离小于maxLineGap就会进行合并。

  1. 下面是一个用HoughLinesP检测直线的例子:

    1. 1 int main()  2 {  3     Mat image=imread("../car.png");  4     Mat I;  5     cvtColor(image,I,CV_BGR2GRAY);  6     Mat contours;  7     Canny(I,contours,125,350);  8     threshold(contours,contours,128,255,THRESH_BINARY);  9     vector
      lines; 10 // 检测直线,最小投票为90,线条不短于50,间隙不小于10 11 HoughLinesP(contours,lines,1,CV_PI/180,80,50,10); 12 drawDetectLines(image,lines,Scalar(0,255,0)); 13 namedWindow("Lines"); 14 imshow("Lines",image); 15 waitKey(); 16 return 0; 17 }

       

上面程序将检测到的线条保存在lines变量内,我们需要进一步将它们画在图像上:

  1. 1 void drawDetectLines(Mat& image,const vector
    & lines,Scalar & color) 2 { 3 // 将检测到的直线在图上画出来 4 vector
    ::const_iterator it=lines.begin(); 5 while(it!=lines.end()) 6 { 7 Point pt1((*it)[0],(*it)[1]); 8 Point pt2((*it)[2],(*it)[3]); 9 line(image,pt1,pt2,color,2); // 线条宽度设置为2 10 ++it; 11 } 12 }

     

实 际上Hough变换可以检测很多固定的形状,比如:圆、正方形等。它们的原理基本相同,都是构造一个投票矩阵。OpenCV里提供了检测圆的函数 HoughCircles,它的输出是一个Vector of Vec3i,Vector的每个元素包含了3个浮点数,前2个是圆的中心坐标,最后一个是半径。

 

转载于:https://www.cnblogs.com/victorysteven/p/7447832.html

你可能感兴趣的文章
23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
查看>>
如何查看Isilon的节点的CPU的信息?
查看>>
C# if为false仍然进入方法体,==和qeual结果不一致
查看>>
MongoDB简单使用 —— 驱动
查看>>
WPF——TargetNullValue(如何在绑定空值显示默认字符)
查看>>
给 iOS 开发者的 RxSwift(一)
查看>>
Excel2013 破解(编辑工作表受保护)密码
查看>>
Python基础-变量作用域
查看>>
php课程 6-21 HTML标签相关函数
查看>>
Spring Boot的Tomcat 启动详解
查看>>
Elasticsearch 2.3.3 JAVA api说明文档
查看>>
zTree怎么判断树有节点展开或者完全关闭的
查看>>
android中RecycleView分页原生代码封装,无任何第三方代
查看>>
Emgu-WPF 激光雷达研究-移动物体跟踪
查看>>
如何删除一个标签,但是保留里面的内容?
查看>>
[Angular] 'providedIn' for service
查看>>
PHP函数register_shutdown_function的使用示例
查看>>
设计模式-行为型模式,python访问者模式
查看>>
GIT 常用命令
查看>>
开源网站流量统计系统Piwik源码分析——后台处理(二)
查看>>