OpenCV-累计概率霍夫变换cv::HoughLinesP
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-累计概率霍夫变换cv::HoughLinesP相关的知识,希望对你有一定的参考价值。
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
函数原型
void HoughLinesP( InputArray image, OutputArray lines,
double rho, double theta, int threshold,
double minLineLength = 0, double maxLineGap = 0 );
参数说明
- InputArray类型的image,输入图像,需为8位的单通道二进制图像。
- InputArray类型的lines,调用HoughLines函数后存储了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量(r,t)表示。r为离坐标原点的距离,t为弧度线条旋转角度。
- double类型的rho,以像素为单位的距离精度。
- double类型的theta,以弧度为单位的角度精度。
- int类型的threshold,累加平面的阈值参数,即识别某部分为图中一直线时它在累加平面中必须达到的值。大于阈值的线段才可以被检测通过并返回到结果中。
- double类型的minLineLength,默认值为0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
- double类型的minLineGap,默认值为0,允许将同一行点与点之间连接起来的最大的距离。
什么是累计概率霍夫变换?
OpenCV支持累计概率霍夫变换(PPHT),调用函数为HoughLinesP,PPHT是标准霍夫变换(SHT)的一个改进,它在一定范围内进行霍夫变换,计算单独线段的方向以及范围,从而大大减少计算量,缩短计算时间。之所以称其为“概率”,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值足够高,只用一小部分时间去寻找它就足够了,PPHT的执行效率相比SHT高很多。
霍夫变换的具体介绍请看:OpenCV-标准霍夫变换cv::HoughLines_翟天保的博客-CSDN博客
测试代码
#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");
测试效果
看过霍夫变换的同学应该知道,两个函数输出line的变量类型不一样,一个是vector<Vec2f>,另一个是vector<Vec4f>,所以在使用时要注意区分;另外个人建议采用累计概率霍夫变换进行直线检测,效率高且识别效果更优。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
以上是关于OpenCV-累计概率霍夫变换cv::HoughLinesP的主要内容,如果未能解决你的问题,请参考以下文章
opencv —— HoughLinesHoughLinesP 霍夫线变换(标准霍夫线变换多尺度霍夫线变换累积概率霍夫线变换)