• OpenCV 霍夫变换-直线 HoughLinesP


    霍夫直线变换介绍
    Hough Line Transform用来做直线检测
    前提条件 – 边缘检测已经完成
    平面空间到极坐标空间转换
    霍夫线变换的原理
    众所周知, 一条直线在图像二维空间可由两个变量表示. 如:
    <1>在笛卡尔坐标系: 可由参数: 斜率和截距(m,b)表示。
    <2>在极坐标系: 可由参数: 极径和极角(r, θ)表示。

    可以用极坐标系来表示直线. 因此, 直线的表达式可为:

     在这里插入图片描述

    化简便可得到:

    在这里插入图片描述

     

     


    OpenCV中的霍夫线变换
    霍夫线变换是一种用来寻找直线的方法. 在使用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像.

    OpenCV支持三种不同的霍夫线变换,它们分别是:
    标准霍夫变换(Standard Hough Transform,SHT),
    多尺度霍夫变换(Multi-Scale Hough Transform,MSHT),
    累计概率霍夫变换(Progressive Probabilistic Hough Transform ,PPHT)。
    其中,多尺度霍夫变换(MSHT)为经典霍夫变换(SHT)在多尺度下的一个变种。累计概率霍夫变换(PPHT)算法是标准霍夫变换(SHT)算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。之所以称PPHT为“概率”的,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值如果足够高,只用一小部分时间去寻找它就够了。这样猜想的话,可以实质性地减少计算时间。

    在OpenCV中,我们可以用HoughLines函数来调用标准霍夫变换SHT和多尺度霍夫变换MSHT。
    而HoughLinesP函数用于调用累计概率霍夫变换PPHT。累计概率霍夫变换执行效率很高,所有相比于HoughLines函数,我们更倾向于使用HoughLinesP函数。

    总结一下,OpenCV中的霍夫线变换有如下三种:

    <1>标准霍夫变换(StandardHough Transform,SHT),由HoughLines函数调用。
    <2>多尺度霍夫变换(Multi-ScaleHough Transform,MSHT),由HoughLines函数调用。
    <3>累计概率霍夫变换(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函数调用。
    相关的API介绍
    1. HoughLines( )函数详解

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

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

    说明:

     1 cv::HoughLines(
     2 InputArray src, // 输入图像,必须8-bit的灰度图像
     3 OutputArray lines, // 输出的极坐标来表示直线,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量(ρ,θ)表示,其中,ρ是离坐标原点((0,0)(也就是图像的左上角)的距离。 θ是弧度线条旋转角度(0~ 垂直线,π/2~水平线)。
     4 double rho, // 生成极坐标时候的像素扫描步长,一般取值为 1 ,不要大于图像尺寸的一半
     5 double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180,即表示一度
     6 int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
     7 double srn=0;// 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换,多尺度表示的是使用图像金字塔,即多尺度图上进行霍夫变换
     8 double stn=0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
     9 double min_theta=0; // 表示角度扫描范围 0 ~180之间, 默认即可
    10 double max_theta=CV_PI
    11 ) // 一般情况是有经验的开发者使用,需要自己反变换到平面空间

    2. HoughLinesP( )函数详解
    此函数在HoughLines的基础上末尾加了一个代表Probabilistic(概率)的P,表明它可以采用累计概率霍夫变换(PPHT)来找出二值图像中的直线。
    霍夫变换直线概率 cv::HoughLinesP最终输出是直线的两个点

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

    说明:

    1 cv::HoughLinesP(
    2 InputArray src, // 输入图像,必须8-bit的灰度图像
    3 OutputArray lines, // 输出的极坐标来表示直线,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
    4 double rho, // 生成极坐标时候的像素扫描步长,一般取值为 1
    5 double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180,即表示一度
    6 int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
    7 double minLineLength=0;// 最小直线长度,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
    8 double maxLineGap=0;// 最大间隔,有默认值0,允许将同一行点与点之间连接起来的最大的距离。
    9 )

    程序代码:

     1 #include<opencv2/opencv.hpp>
     2 #include<iostream>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 void main(int argc, char** argv)
     8 {
     9     //1. 读取图像
    10     Mat src, canny, dst;
    11     src = imread("E:/Experiment/OpenCV/Pictures/LineTest.jpg");
    12     imshow("src", src);
    13 
    14     //2. 获取边缘
    15     Canny(src, canny, 100, 200);
    16     imshow("canny", canny);
    17     //3. 转成灰度图像
    18     cvtColor(canny, dst, CV_GRAY2BGR);//将二值图转换为RGB图颜色空间,这里重新创建一张空Mat也行
    19     //4. 霍夫变换检测
    20     vector<Vec4f> plines;//保存霍夫变换检测到的直线
    21     HoughLinesP(canny, plines, 1, CV_PI / 180, 10, 0, 10);//提取边缘时,会造成有些点不连续,所以maxLineGap设大点
    22     //5. 显示检测到的直线
    23     Scalar color = Scalar(0, 0, 255);//设置颜色
    24     for (size_t i = 0; i < plines.size(); i++)
    25     {
    26         Vec4f hline = plines[i];
    27         line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);//绘制直线
    28     }
    29     imshow("plines", dst);
    30 
    31     waitKey(0);
    32 }

    运行截图

    在这里插入图片描述

  • 相关阅读:
    HTML DOM 12 表格排序
    HTML DOM 10 常用场景
    HTML DOM 10 插入节点
    HTML DOM 09 替换节点
    HTML DOM 08 删除节点
    HTML DOM 07 创建节点
    022 注释
    024 数字类型
    005 基于面向对象设计一个简单的游戏
    021 花式赋值
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12826850.html
Copyright © 2020-2023  润新知