霍夫变换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
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
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函数把边缘检测后的图像转化为灰度图,再调用霍夫变换函数即可检测直线。