资源描述:
《OpenCV函数cvHoughLines2进行Hough变换》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、OpenCV函数cvHoughLines2进行Hough变换霍夫变换(HoughTransform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫变换于1962年由PaulHough首次提出[53],后于1972年由RichardDuda和PeterHart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。Hough变换用来在图象中查找直线。它的原理很简单:假设有一
2、条与原点距离为s,方向角为6的一条直线,如图7.6所示。直线上的每一点都满足方程我们知道,一条直线在直角坐标系下可以用y二kx+b表示,霍夫变换的主要思想是将该方程的参数和变量交换,即用x,y作为已知量k,b作为变量坐标,所以直角坐标系下的直线y=kx+b在参数空间表示为点(k,b),而一个点(x4,y“在直角坐标系下表示为一条直线y仁x"l•k+b,其中(k,b)是该直线上的任意点。为了计算方便,我们将参数空间的坐标表示为极坐标下的S和0。因为同一条直线上的点对应的(s,e)是相同的,因此可以先将图片进行边缘检测,然后对图像上每一个非零像素点
3、,在参数坐标下变换为一条直线,那么在直角坐标下属于同一条直线的点便在参数空间形成多条直线并内交于一点。因此可用该原理进行直线检测。在Opencv中已经有了利用Hough变换在二值图中找到直线的接口了,这里就直接调用,下面是我的实例:[cpp]viewplaincopy#include<cv.h>#include<highgui.h><P></P><P>#pragmacomment(lib,"cv.lib")#pragmacomment(lib,"cxcore.lib")#pragmac
4、omment(lib,"highgui.lib")</P>intmain(){Ipllmage*plmgSrc=NULL;〃源图像Ipllmage*plmg8u=NULL;〃灰度图Ipllmage*plmgCanny=NULL;〃边缘检测后的图Ipllmage*plmgDst=NULL;〃在图像上画上检测到的直线后的图像CvSeq*lines=NULL;CvMemStorage*storage=NULL;广边缘检测*/plmgSrc=cvLoadlmage(H1.jpgH,1);plmg8u=cvCreatelmage(cvGetS
5、ize(plmgSrc),IPL_DEPTH_8U,1);plmgCanny=cvCreatelmage(cvGetSize(plmgSrc),IPL_DEPTH_8U,1);plmgDst=cvCreatelmage(cvGetSize(plmgSrc),IPL_DEPTH_8U,1);cvCvtColor(plmgSrc,plmg8u,CV_BGR2GRAY);cvCanny(plmg8u,plmgCanny,20,200,3);广检测直线*/storage=cvCreateMemStorage(0);lines=cvHoughLines2
6、(plmgCanny,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,80,200,10);plmgDst=cvCreatelmage(cvGetSize(plmgSrc),IPL_DEPTH_8U,3);cvCvtColor(plmg8u,plmgDst,CV_GRAY2BGR);广在plmgDst上画出检测到的直线*/for(inti=0;i&It;lines->total;i++){CvPoint*line=(CvPoint*)cvGetSeqElem(lines,i);cvLine(plmgD
7、st,line[0],line[1],CV_RGB(255,0,0),3,8);}cvNamedWindow("src",1);cvNamedWindow("canny",1);cvNamedWindow("hough",1);cvShowImage("src",plmgSrc);cvShowImage("canny”,plmgCanny);cvShowImage("hough",plmgDst);cvWaitKey(0);cvReleaselmage(&plmgSrc);cvReleaselmage(&plmg8u);cvRe
8、leaselmage(&plmgCanny);cvReleaselmage(&plmgDst);cvReleaseMemStorage