美文网首页
用霍夫变换HoughLines检测直线2

用霍夫变换HoughLines检测直线2

作者: 大龙10 | 来源:发表于2023-01-28 08:43 被阅读0次

    书名:OpenCV计算机视觉编程攻略(第3版)
    作者:[加]罗伯特·拉戈尼尔
    译者:相银初
    出版社:人民邮电出版社
    出版时间:2018-05
    ISBN:9787115480934

    一、HoughLinesP函数

    • 为解决上述问题(即测出的结果重复)并检测到线段(即包含端点的直线),人们提出了霍夫变换的改进版。这就是概率霍夫变换,在OpenCV中通过cv::HoughLinesP函数实现。我们用它创建LineFinder类,封装函数的参数:
            class LineFinder {
              private:
              // 原始图像
              cv::Mat img;
              // 包含被检测直线的端点的向量
          std::vector<cv::Vec4i> lines;
          // 累加器分辨率参数
          double deltaRho;
          double deltaTheta;
          // 确认直线之前必须收到的最小投票数
          int minVote;
          // 直线的最小长度
          double minLength;
          // 直线上允许的最大空隙
          double maxGap;
          public:
            // 默认累加器分辨率是1像素,1度
            // 没有空隙,没有最小长度
            LineFinder() : deltaRho(1), deltaTheta(PI/180),
                          minVote(10), minLength(0.), maxGap(0.) {}
    
    • 对应的设置方法:
        // 设置累加器的分辨率
        void setAccResolution(double dRho, double dTheta) {
          deltaRho= dRho;
          deltaTheta= dTheta;
        }
        // 设置最小投票数
        void setMinVote(int minv) {
          minVote= minv;
        }
        // 设置直线长度和空隙
        void setLineLengthAndGap(double length, double gap) {
          minLength= length;
          maxGap= gap;
        }
    

    二、检测霍夫线段的代码

        // 应用概率霍夫变换
        std::vector<cv::Vec4i> findLines(cv::Mat& binary) {
          lines.clear();
          cv::HoughLinesP(binary, lines,
                          deltaRho, deltaTheta, minVote,
                          minLength, maxGap);
          return lines;
        }
    
    • 这个方法返回cv::Vec4i类型的向量,包含每条被检测线段的开始端点和结束端点的坐标。我们可以用下面的方法在图像上绘制检测到的线段:
            // 在图像上绘制检测到的直线
            void drawDetectedLines(cv::Mat &image,
                                    cv::Scalar color=cv::Scalar(255,255,255)) {
              // 画直线
              std::vector<cv::Vec4i>::const_iterator it2= lines.begin();
    
              while (it2! =lines.end()) {
                cv::Point pt1((*it2)[0], (*it2)[1]);
                cv::Point pt2((*it2)[2], (*it2)[3]);
                cv::line( image, pt1, pt2, color);
               ++it2;
              }
            }
    
    • 输入图像不变,可以用下面的次序检测直线:
            // 创建LineFinder类的实例
            LineFinder finder;
    
    
            // 设置概率霍夫变换的参数
            finder.setLineLengthAndGap(100,20);
            finder.setMinVote(60);
    
    
            // 检测直线并画线
            std::vector<cv::Vec4i> lines= finder.findLines(contours);
            finder.drawDetectedLines(image);
    
    • 得到如下结果。


    相关文章

      网友评论

          本文标题:用霍夫变换HoughLines检测直线2

          本文链接:https://www.haomeiwen.com/subject/clyyhdtx.html