霍夫变换是一种在图像中寻找直线、圆及其他简单形状的方法,霍夫线变换是利用Hough变换在二值图像中找到直线。
利用CV_HOUGH_PROBABILISTIC,对应PPHT(累计概率霍夫变换)?这个算法的具体实现有待深究!!!
----------------------------------------------------------------------------------------------------
霍夫线变换的函数为:
利用 Hough 变换在二值图像中找到直线
CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold, double param1=0, double param2=0 );
函数 cvHoughLines2 实现了用于线段检测的不同 Hough 变换方法. Example. 用 Hough transform 检测线段
----------------------------------------------------------------------------------------------------/*code*/
程序中用到了cvCvtColor色彩空间转换,将输入图像从一个色彩空间转换为另外一个色彩空间,Canny处理的是单通道图像,然后转换为三通道图像再使用Hough变换。
#include <highgui.h> #include <cv.h> #include <math.h> int main(int argc, char** argv) { IplImage* src; src = cvLoadImage( argv[1], 0 ); //加载灰度图 IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); IplImage* color_dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 3 ); //创建三通道图像 CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; cvCanny( src, dst, 50, 100, 3 ); //首先运行边缘检测,结果以灰度图显示(只有边缘) cvCvtColor( dst, color_dst, CV_GRAY2BGR ); //色彩空间转换,将dst转换到另外一个色彩空间即3通道图像 lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 ); //直接得到直线序列 //循环直线序列 for( int i = 0; i < lines ->total; i++ ) //lines存储的是直线 { CvPoint* line = ( CvPoint* )cvGetSeqElem( lines, i ); //lines序列里面存储的是像素点坐标 cvLine( color_dst, line[0], line[1], CV_RGB( 0, 255, 0 ) ); //将找到的直线标记为红色 //color_dst是三通道图像用来存直线图像 } cvNamedWindow( "src", 1 ); cvShowImage( "src", src ); cvNamedWindow( "Hough", 1 ); cvShowImage( "Hough", color_dst ); cvWaitKey(0); return 0; }----------------------------------------------------------------------------------------------------
由图看出,用绿色线条勾画的是Canny轮廓检测后再用Hough线变换得到的所有直线。