zoukankan      html  css  js  c++  java
  • opencv::霍夫变换-直线

    霍夫直线变换介绍
    Hough Line Transform用来做直线检测
    前提条件 – 边缘检测已经完成
    平面空间到极坐标空间转换

    对于任意一条直线上的所有点来说,变换到极坐标中,从[0~360]空间,可以得到r的大小
    属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线.

    标准的霍夫变换 cv::HoughLines从平面坐标转换到霍夫空间,最终输出是 表示极坐标空间

    霍夫变换直线概率 cv::HoughLinesP最终输出是直线的两个点

    cv::HoughLines(
        InputArray src,          // 输入图像,必须8-bit的灰度图像
        OutputArray lines,       // 输出的极坐标来表示直线
        double rho,              // 生成极坐标时候的像素扫描步长
        double theta,            // 生成极坐标时候的角度步长,一般取值CV_PI/180
        int threshold,           // 阈值,只有获得足够交点的极坐标点才被看成是直线
        double srn=0;            // 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
        double stn=0;            // 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
        double min_theta=0;      // 表示角度扫描范围 0 ~180之间, 默认即可
        double max_theta=CV_PI
    ) // 一般情况是有经验的开发者使用,需要自己反变换到平面空间
    cv::HoughLinesP(
        InputArray src,        // 输入图像,必须8-bit的灰度图像
        OutputArray lines,     // 输出的极坐标来表示直线
        double rho,            // 生成极坐标时候的像素扫描步长
        double theta,          //生成极坐标时候的角度步长,一般取值CV_PI/180
        int threshold,         // 阈值,只有获得足够交点的极坐标点才被看成是直线
        double minLineLength=0;     // 最小直线长度
        double maxLineGap=0;        // 最大间隔
    )
    int main(int argc, char** argv) {
        Mat src, src_gray, dst;
        src = imread(STRPAHT3);
        if (!src.data) {
            printf("could not load image...
    ");
            return -1;
        }
        //边缘检测
        Canny(src, src_gray, 150, 200);
        //灰度
        cvtColor(src_gray, dst, CV_GRAY2BGR);
    /*
        vector<Vec2f> lines;
        HoughLines(src_gray, lines, 1, CV_PI / 180, 150, 0, 0);
        for (size_t i = 0; i < lines.size(); i++) {
            float rho = lines[i][0]; // 极坐标中的r长度
            float theta = lines[i][1]; // 极坐标中的角度
            Point pt1, pt2;
            double a = cos(theta), b = sin(theta);
            double x0 = a * rho, y0 = b * rho;
            // 转换为平面坐标的四个点
            pt1.x = cvRound(x0 + 1000 * (-b));
            pt1.y = cvRound(y0 + 1000 * (a));
            pt2.x = cvRound(x0 - 1000 * (-b));
            pt2.y = cvRound(y0 - 1000 * (a));
            line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);
        }*/
    
        vector<Vec4f> plines;
    //霍夫直线检测 HoughLinesP(src_gray, plines,
    1, CV_PI / 180.0, 10, 0, 10); Scalar color = Scalar(0, 0, 255); for (size_t i = 0; i < plines.size(); i++) { Vec4f hline = plines[i]; line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA); } imshow("OUTPUT_TITLE", dst); waitKey(0); return 0; }
  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/osbreak/p/11468317.html
Copyright © 2011-2022 走看看