霍夫变换

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

霍夫变换

一.概述

霍夫变换是一种图像特征提取技术,是一种有效的快速准确地检测出直线或圆的方法,是基本的识别图像几何形状的方法之一。

二 . opencv中的霍夫变换

1.Opencv支持的霍夫线变换有三种

a)标准霍夫变换

b)多尺度霍夫变换

c)累计概率霍夫变换(标准霍夫变换的改进,效率更高)

2.霍夫变换是从黑白图像中检测直线的,霍夫变换的直接输入只能是边缘二值图像,所以在使用霍夫变换之前要对图像进行边缘检测处理,

3.HoughiLines:可调用标准霍夫变换

HoughLines(a,b,c,d,e,f,g)

a表示源图像

b表示调用函数后得到的输出矢量(用来确定直线位置的矢量),一般默认写为“lines”

c表示极坐标系中的ρ

d表示极坐标系中的角度θ

e表示阈值(指的是触发直线判断所需要的的最低值)

f,g在使用标准霍夫变换时默认为0

4.HoughLinesP:可调用累计概率霍夫变换

HoughLinesP(a,b,c,d,e,f,g)

a表示源图像

b表示调用函数后得到的输出矢量(用来确定直线位置的矢量),一般默认写为“lines”

c表示极坐标系中的ρ

d表示极坐标系中的角度θ

e表示阈值(指的是触发直线判断所需要的的最低值)

f,g在使用累计概率霍夫变换时默认为要为正值

三 . 初期效果

源代码

#include

#include

using namespace cv;

using namespace std;

int main( )

{

while(1)

{

VideoCapture capture(0);

Mat srcImage;

capture >> srcImage;//读取当前帧图片

//【1】通过摄像头采取视频载入原始图和Mat变量定义

Mat midImage,dstImage;//临时变量和目标图的定义

//【2】进行边缘检测和转化为灰度图

Canny(srcImage, midImage, 50, 200, 3);//canny边缘检测

cvtColor(midImage,dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图

//标准霍夫变换

//【3】进行霍夫线变换

vector lines;//定义一个矢量结构lines用于存放得到的线段矢量集合

HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );

//【4】依次在图中绘制出每条线段

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));

//此句代码的OpenCV2版为:(妙算所用版本我windows下搭建的是opencv3环境)

//line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);

//此句代码的OpenCV3版为:

line( dstImage, pt1, pt2, Scalar(55,100,195), 1, LINE_AA);

}

//累计概率霍夫变换

/*vector lines;

HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10 );

for(size_t i=0;i < lines.size();i++)

{

Vec4i l = lines[i];

line(dstImage, Point(l[0],l[1]),Point(l[2],l[3]),Scalar(186,88,255),1,LINE_AA);

}*/

//【5】显示原始图

imshow("【原始图】", srcImage);

//【6】边缘检测后的图

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

//【7】显示效果图

imshow("【效果图】", dstImage);

//【8】延时40ms 然后读取下一帧

waitKey(1);

}

return 0;

}

运行效果

标准霍夫变换得到的图像

累计概率霍夫变换得到的图像

整体思路就是通过调用摄像头获取图像,然后调用Canny函数进行边缘检测,再调用cvtColor函数把边缘检测后的图像转化为灰度图,再调用霍夫变换函数即可检测直线。

相关文档
最新文档