opencv中houghlines函数返回的rho和theta

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);
                
                }
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCVHoughLinesHoughLinesP函数都是用于检测图像的直线的函数,其HoughLinesP函数HoughLines函数更加灵活,可以检测任意角度的直线,而HoughLines函数只能检测水平和垂直方向的直线。两个函数的参数含义如下: HoughLinesP函数: - image:输入的二值化图像。 - lines:输出的直线向量。 - rho:距离精度,以像素为单位。 - theta:角度精度,以弧度为单位。 - threshold:阈值参数,只有累加器的值大于等于该值时,才认为是一条直线。 - minLineLength:线的最小长度,小于此长度的线将被忽略。 - maxLineGap:两条线段之间的最大间隔,小于此间隔的线段将被连接成一条直线。 HoughLines函数: - image:输入的二值化图像。 - lines:输出的直线向量。 - rho:距离精度,以像素为单位。 - theta:角度精度,以弧度为单位。 - threshold:阈值参数,只有累加器的值大于等于该值时,才认为是一条直线。 - srn:默认值为0,表示没有任何缩放。如果不为0,则表示使用多尺度Hough变换,其srn表示距离分辨率的缩放比例。 - stn:默认值为0,表示没有任何缩放。如果不为0,则表示使用多尺度Hough变换,其stn表示角度分辨率的缩放比例。 - min_theta:表示检测到的直线的最小角度。 - max_theta:表示检测到的直线的最大角度。 下面是一个使用HoughLinesP函数检测图像直线的例子: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # 检测直线 lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=100, minLineLength=100, maxLineGap=10) # 绘制直线 for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值