opencv中houghlines函数返回的rho和theta

来源:互联网 发布:百度云盘加载数据失败 编辑:程序博客网 时间:2024/05/17 21:06

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);
                
                }
0 0
原创粉丝点击