1 void main() 2 { 3 IplImage* src=cvLoadImage("1.jpg",CV_LOAD_IMAGE_UNCHANGED); 4 IplImage* gray=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); 5 cvCvtColor(src,gray,CV_RGB2GRAY); 6 cvCanny(gray,gray,50,200,3); //转化为二值图 7 CvMemStorage* storage=cvCreateMemStorage(0); 8 int flag=1; 9 #if (flag==0) 10 //使用标准霍夫变换 11 CvSeq* lines = cvHoughLines2(gray,storage,CV_HOUGH_STANDARD,1,CV_PI/180,100,0,0); 12 for (int i=0;i<lines->total;i++) 13 { 14 float* line=(float*)cvGetSeqElem(lines,i); 15 float rho=line[0]; //极半径 16 float theta=line[1]; //角度 17 CvPoint pt1,pt2; 18 double a=cos(theta), b=sin(theta); 19 double x0=rho*a,y0=rho*b; 20 //参数方程 21 pt1.x=cvRound(x0-2000*b); 22 pt1.y=cvRound(y0+2000*a); 23 pt2.x=cvRound(x0+2000*b); 24 pt2.y=cvRound(y0-2000*a); 25 cvLine(src,pt1,pt2,CV_RGB(255,0,0),1); 26 } 27 #else 28 //累计概率霍夫变换 29 CvSeq* lines=cvHoughLines2(gray,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,50,50,10); 30 for (int i=0;i<lines->total;i++) 31 { 32 CvPoint* point=(CvPoint*)cvGetSeqElem(lines,i); 33 cvCircle(src,point[0],4,CV_RGB(0,255,0)); 34 cvCircle(src,point[1],4,CV_RGB(0,255,0)); 35 //画线段,而不是直线 36 cvLine(src,point[0],point[1],cvScalar(0,0,255,0)); 37 } 38 #endif 39 cvShowImage("1",src); 40 cvWaitKey(); 41 }
测试结果: