OpenCV-累计概率霍夫变换cv::HoughLinesP

简介: OpenCV-累计概率霍夫变换cv::HoughLinesP

函数原型

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


参数说明

  1. InputArray类型的image,输入图像,需为8位的单通道二进制图像。
  2. InputArray类型的lines,调用HoughLines函数后存储了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量(r,t)表示。r为离坐标原点的距离,t为弧度线条旋转角度。
  3. double类型的rho,以像素为单位的距离精度。
  4. double类型的theta,以弧度为单位的角度精度。
  5. int类型的threshold,累加平面的阈值参数,即识别某部分为图中一直线时它在累加平面中必须达到的值。大于阈值的线段才可以被检测通过并返回到结果中。
  6. double类型的minLineLength,默认值为0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
  7. double类型的minLineGap,默认值为0,允许将同一行点与点之间连接起来的最大的距离。


什么是累计概率霍夫变换?

     OpenCV支持累计概率霍夫变换(PPHT),调用函数为HoughLinesP,PPHT是标准霍夫变换(SHT)的一个改进,它在一定范围内进行霍夫变换,计算单独线段的方向以及范围,从而大大减少计算量,缩短计算时间。之所以称其为“概率”,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值足够高,只用一小部分时间去寻找它就足够了,PPHT的执行效率相比SHT高很多。

测试代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void main()
{
  Mat src = imread("test.png");
  Mat mid, dst;
  Canny(src, mid, 200, 250);
  cvtColor(mid, dst, COLOR_GRAY2BGR);
  // 累计概率霍夫变换
  vector<Vec4f> lines;
  HoughLinesP(mid, lines, 1, CV_PI / 180.0, 150, 50, 20);
  for (size_t i = 0; i < lines.size(); ++i)
  {
    Vec4f l = lines[i];
    line(dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 255), 1, 16);
  }
  imshow("src", src);
  imshow("mid", mid);
  imshow("result", dst);
  waitKey(0);
  system("pause");
}

测试效果

图1 原图

图2 边缘检测

图3 直线检测效果图

      看过霍夫变换的同学应该知道,两个函数输出line的变量类型不一样,一个是vector<Vec2f>,另一个是vector<Vec4f>,所以在使用时要注意区分;另外个人建议采用累计概率霍夫变换进行直线检测,效率高且识别效果更优。


      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
6月前
|
编解码 计算机视觉
OpenCV(三十六):霍夫直线检测
OpenCV(三十六):霍夫直线检测
141 0
|
4月前
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
68 4
|
3月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
3月前
|
计算机视觉
OpenCV 图像类型标识符 CV_<bit_depth><S|U|F>C<number_of_channels>
OpenCV 图像类型标识符 CV_<bit_depth><S|U|F>C<number_of_channels>
38 0
|
5月前
|
计算机视觉
opencv之形态变换
opencv之形态变换
|
5月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
91 0
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
36 0
|
6月前
|
存储 编解码 算法
【OpenCV】-霍夫变换
【OpenCV】-霍夫变换
|
6月前
|
计算机视觉 Python
轻松掌握opencv的8种图像变换
轻松掌握opencv的8种图像变换
|
6月前
|
计算机视觉
【OpenCV】-仿射变换
【OpenCV】-仿射变换