cvHoughLines2()直线检测中代码的疑惑
rho (0,0)到直线的距离,rho的正负判定:Y轴截距大于0的均为正,Y轴截距小于0则rho为负。theta为直线与Y轴负方向的夹角,以Y轴负轴为起始轴,逆时针旋转到直线的角度。
houghlines2()的meth参数有三种,你问的代码是CV_HOUGH_STANDARD,CV_HOUGH_PROBABILISTIC。在STANDARD里,lines返回rho和theta,分别代表直线与原点的距离和 直线与Y周负向夹角(0-180),在PROBABILISTIC里,lines返回线段的头尾两个坐标值,至于在STANDARD里为什么:pt1.x=cvRound(...),是为了把rho和theta转换为坐标在窗口里显示出来,我也不知道为什么那样搞,就是初中几何知识,我用的方法和他不一样, for(int i=0;i<lines->total;i++) { float* line =(float*)cvGetSeqElem(lines,i); CvPoint ptr1,ptr2; float rho=line[0]; float theta=line[1]; double cos_theta=cos(theta),sin_theta=sin(theta); if (fabs(sin_theta)<0.01) //直线水平 { ptr1.x=cvRound(rho); ptr1.y=0; ptr2.x=cvRound(rho); ptr2.y=img->width; } else if(fabs(cos_theta)<0.01) //直线垂直 { ptr1.x=0; ptr1.y=cvRound(rho); ptr2.x=img->width; ptr2.y=cvRound(rho); } else if(rho<0) { ptr1.x=cvRound(rho/cos_theta); ptr1.y=0; ptr2.x=img->width; ptr2.y=cvRound(fabs(img->width/tan(theta))+rho/sin_theta); } else if(theta<1.57078) { ptr1.x=0; ptr1.y=cvRound(rho/sin_theta); ptr2.x=cvRound(rho/cos_theta); ptr2.y=0; } else { ptr1.x=0; ptr1.y=cvRound(rho/sin_theta); ptr2.x=img->width; ptr2.y=cvRound(fabs(img->width/tan(theta))+rho/sin_theta); } |