美文网首页
用霍夫变换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

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

  • 用霍夫变换HoughLines检测直线

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

  • OpenCV(Python)学习-霍夫变化直线和圆检测

    概述 了解霍夫变换以及该方法如何检测图片中的直线,学习了解cv2.Canny、cv2.HoughLines...

  • 用霍夫变换HoughLines检测直线3

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

  • 霍夫变换

    霍夫变换——直线   Hough Line Transform用来做直线检测,前提是已经做了边缘检测。  霍夫变换...

  • 霍夫变换之直线检测

    霍夫变换 查看图像 结果: 边缘检测 结果: 霍夫变换检测直线 结果:

  • OpenCV-Python学习(十六):霍夫变换

    目录: 1.什么是霍夫变换? 2.OpenCV中的霍夫线变换-->直线检测 3.OpenCV中的霍夫圆变换-->圆...

  • 2019-06-03 OpenCV学习

    21直线检测 霍夫直线变换用来做直线检测,前提条件是边缘检测已完成。 22圆检测 霍夫圆变换原理: 从平面坐标到极...

  • 霍夫变换

    一、霍夫直线检测 霍夫变换(Hough Transfrom),是1972年提出的,最开始就是用来在图像中检测直线,...

  • 标准霍夫线

    标准霍夫线变换cv2.HoughLines(image, rho, theta, threshold[, line...

网友评论

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

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