其他分享
首页 > 其他分享> > opencv —— HoughLines、HoughLinesP 霍夫线变换(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)

opencv —— HoughLines、HoughLinesP 霍夫线变换(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)

作者:互联网

霍夫线变换的原理

① 在笛卡尔坐标系中:可由参数斜率和截距(k,b)表示。

② 在极坐标系中:可由参数极经和极角(r,θ)表示。

对于霍夫线变换,我们将采用第二种方式极坐标系来表示直线,因此直线的表达式可为:

化简便可得到:

 

这就意味着每一对 (r_{\theta},\theta) 代表一条通过点 (x_{0}, y_{0}) 的直线。 

 

Polar plot of the family of lines for three points

 

OpenCV 实现了以下三种霍夫线变换:

  1. 标准霍夫变换(StandardHough Transform,SHT)
    • 原理在上面的部分已经说明了. 它能给我们提供一组参数对 (\theta, r_{\theta}) 的集合来表示检测到的直线。
    • 在 OpenCV 中通过函数 HoughLines 来实现。
  2. 多尺度霍夫变换(Multi-ScaleHough Transform,MSHT)
    • 和标准霍夫变换类似。
  3. 累计概率霍夫变换(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函数调用。
    • 这是执行起来效率更高的霍夫线变换. 它输出检测到的直线的端点 (x_{0}, y_{0}, x_{1}, y_{1})
    • 在 OpenCV 中它通过函数 HoughLinesP 来实现。
  标准 & 多尺度 霍夫线变换:HoughLines 函数

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn = 0, double stn = 0);

 

代码示例:

#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int hough_value = 70;
Mat src, canny_img;
void hough_change(int, void*) {
    vector<Vec2f>lines;
    HoughLines(canny_img, lines, 1, CV_PI / 180.0, hough_value);
    RNG rngs = { 12345 };
    Mat show = src.clone();
    for (int i = 0; i < lines.size(); i++) {
        float rho = lines[i][0], theta = lines[i][1];

        double sin_theta = sin(theta), cos_theta = cos(theta);
        double x = rho * cos_theta, y = rho * sin_theta;

        //以垂点为基础,将直线延长
        Point pt1, pt2;
        pt1.x = cvRound(x + 1000 * (-sin_theta));
        pt1.y = cvRound(y + 1000 * (cos_theta));
        pt2.x = cvRound(x - 1000 * (-sin_theta));
        pt2.y = cvRound(y - 1000 * (cos_theta));

        Scalar colors = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255));
        line(show, pt1, pt2, colors, 2);
    }
    imshow("show", show);
}
int main() {
    src = imread("C:/Users/齐明洋/Desktop/1.jpg");
    GaussianBlur(src, src, Size(3, 3), 0, 0);
    imshow("src", src);

    Canny(src, canny_img, 55, 110, 3);
    imshow("canny_img", canny_img);

    namedWindow("show");
    createTrackbar("threshold", "show", &hough_value, 200, hough_change);
    hough_change(0, 0);

    waitKey(0);
}

效果演示:

 

 

 

累计概率霍夫变换:HoughLinesP 函数

void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength = 0, double maxLineGap= 0);

 

代码示例:

 

效果演示:

 

借鉴博客:https://www.cnblogs.com/xmu-rcs-jty/p/7531814.html

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

 

标签:直线,变换,double,lines,HoughLinesP,霍夫线,theta
来源: https://www.cnblogs.com/bjxqmy/p/12331656.html