霍夫变换是一种在图像中寻找直线,圆及其他简单形状的方法。opencv支持两种不同的霍夫变换:标准霍夫变换(SHT)和累积概率霍夫变换(PPHT)。在opencv中可以使用同一个函数来使用两种算法。
相关函数如下:
CvSeq* cvHonghLines2(CvArr* image, void* line_storage,int mehtod, double rho, double theta, int threshold, double param1 =0, double param2 =0 );
image 输入 8-比特、单通道 (二值) 图像
line_storage 存储检测到的线段,可以是序列或者单行/单列矩阵
mehtod Hough 变换变量
rho 与象素相关单位的距离精度
image 输入 8-比特、单通道 (二值) 图像
line_storage 存储检测到的线段,可以是序列或者单行/单列矩阵
mehtod Hough 变换变量
rho 与象素相关单位的距离精度
theta
弧度测量的角度精度
threshold
阈值参数。如果相应的累计值大于 threshold, 则函数返回的这个线段
param1 和param2为与变换方法有关的参数
Reference《学习opencv》param1 和param2为与变换方法有关的参数
#include "StdAfx.h" #include<cv.h> #include<highgui.h> #include<math.h> int main() { IplImage* sourceImage; sourceImage= cvLoadImage("大中南.jpg",0); IplImage* destImage=cvCreateImage(cvGetSize(sourceImage),8,1); IplImage* colorImage=cvCreateImage(cvGetSize(sourceImage),8,3); //分配空间,默认64KB CvMemStorage* storage=cvCreateMemStorage(0); CvSeq* lines=0; //指向所检测到的线的序列的第一条... //首先对源图像进行边缘检测,结果以灰度图显示, cvCanny(sourceImage,destImage,50,200,3); cvCvtColor(destImage,colorImage,CV_GRAY2BGR); lines=cvHoughLines2(//返回一个指向CvSeq序列结构的的指针, destImage,//要进行霍夫检测的图像,必须是8位的, storage, //保存结果位置的指针, CV_HOUGH_PROBABILISTIC, 1, //这两个参数都是用来设置直线的分辨率的 CV_PI/180, 80, //一个阈值 30, 10 //表示支持所返回的直线的点的数量 ); int index; //index为直线的索引 for(index=0;index<lines->total;index++) //遍历每一条线 { CvPoint* line=(CvPoint*)cvGetSeqElem(lines,index); cvLine(colorImage,line[0],line[1],CV_RGB(255,0,0),3,8); } cvNamedWindow("SOURCEIMAGE",1); cvShowImage("SOURCEIMAGE",sourceImage); cvNamedWindow("COLORIMAGE",1); cvShowImage("COLORIMAGE",colorImage); cvNamedWindow("HOUGH",1); cvShowImage("HOUGH",colorImage); cvWaitKey(0); return 0; }运行结果: