《Open CV3编程入门》学习笔记13

累计概率霍夫变换

累计概率霍夫变换算法是标准霍夫变换算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩小计算时间。之所以称概率,是因为并不将累加器平面内的所有点累加,而只是累加其中的一部分,该想法是如果峰值如果足够高,只用一小部分时间去寻找它就足够了。
该方法只要检测的直线上的点达到阈值,剩余点可不必进行霍夫变换从而减少了计算。
标准霍夫变换本质上是把图像映射到它的参数空间上,它需要计算所有的M个边缘点。如果在输入图像中只是处理m(m<M)个边缘点,则这m个边缘点的选取是具有一定概率性的,因此该方法被称为概率霍夫变换。该方法还有一个重要的特点就是能够检测出线端,即能够检测出图像中直线的两个端点,确切地定位图像中的直线。
HoughLinesP函数就是利用概率霍夫变换来检测直线的。它的一般步骤为:
1、随机抽取图像中的一个特征点,即边缘点,如果该点已经被标定为是某一条直线上的点,则继续在剩下的边缘点中随机抽取一个边缘点,直到所有边缘点都抽取完了为止;
2、对该点进行霍夫变换,并进行累加和计算;
3、选取在霍夫空间内值最大的点,如果该点大于阈值的,则进行步骤4,否则回到步骤1;
4、根据霍夫变换得到的最大值,从该点出发,沿着直线的方向位移,从而找到直线的两个端点;

5、计算直线的长度,如果大于某个阈值,则被认为是好的直线输出,回到步骤1。

具体可参考:http://blog.csdn.net/zhaocj/article/details/40047397

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main( )
{
	//【1】载入原始图和Mat变量定义   
	Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
	Mat midImage,dstImage;//临时变量和目标图的定义

	//【2】进行边缘检测和转化为灰度图
	cvtColor(srcImage,dstImage, CV_BGR2GRAY);//转化边缘检测后的图为灰度图
	Canny(dstImage,midImage, 50, 200, 3);//进行一此canny边缘检测
	

    //【3】进行霍夫线变换
	vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
	HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50,1 );
	/*第一个参数:输入8位单通道图像;
	第二个参数:InputArray类型的lines,为检测到的线条的输出矢量,每一条线由具有4个元素的矢量(x_1,y_1,x_2,y_2)表示,其中(x_1,y_1)和(x_2,y_2)是每个检测到的线段的端点;
    第三个参数:double类型的rho,以像素为单位的距离精度。另一种表述方式是直线搜索时的进步尺寸的单位半径。即ρ精度;
	第四个参数:double类型的theta,以弧度为单位的角度精度。另一种表述方式是直线搜索时的进步尺寸的单位角度;
	第五个参数:int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线是它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中;
	第六个参数:double类型的minLineLength,由默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显示出来。该值不同上一个阈值参数,
	上一个阈值参数为线段内必须包含的点数,而此处长度由点间间隔(最大间隔由下一个参数决定)加线段上所有点决定;
	第七个参数:double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离;
	*/

	//【4】依次在图中绘制出每条线段
	for( size_t i = 0; i < lines.size(); i++ )
	{
		Vec4i l = lines[i];
		line( srcImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186,88,255), 1, CV_AA);
	}

	//【5】边缘检测后的图 
	imshow("【边缘检测后的图】", midImage);  

	//【6】显示效果图  
	imshow("【效果图】", srcImage);  

	waitKey(0);  

	return 0;  
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值