概率霍夫变换是一种基于泛洪算法的直线检测算法。相较于传统霍夫变换,概率霍夫变换可以在保证一定的精度前提下,大大提高了直线检测效率。下面是 OpenCV C++ 实现概率霍夫检测的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{Mat src, dst, color_dst;if (argc != 2 || !(src = imread(argv[1], IMREAD_GRAYSCALE)).data)return -1;Canny(src, dst, 50, 200, 3);cvtColor(dst, color_dst, COLOR_GRAY2BGR);vector4i> lines;HoughLinesP(dst, lines, 1, CV_PI / 180, 50, 50, 10);for (size_t i = 0; i < lines.size(); i++){Vec4i l = lines[i];line(color_dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);}namedWindow("Source", WINDOW_NORMAL);imshow("Source", src);namedWindow("Detected Lines", WINDOW_NORMAL);imshow("Detected Lines", color_dst);waitKey(0);return 0;
}
代码解释如下:
- 首先读入一张灰度图片并进行 Canny 边缘检测。
- 然后调用`cv::HoughLinesP` 函数进行概率霍夫检测,检测到的直线存储在`std::vector<Vec4i>` 中。
对于 HoughLinesP 函数几个参数的含义:
-`dst`:输入图像;
-`lines`:输出的直线集合;
-`1`:表示直线的检测步长,单位为像素;
-`CV_PI / 180`:表示角度的检测步长,单位为弧度;
-`50`:表示累加阈值,累加值低于该值则被丢弃;
-`50`:表示最小线段长度,小于该值的线条会被丢弃;
-`10`:表示最大线段间隙,同一条线段中断的间隙超过该值则会被分为两条线段。
- 最后,将检测到的直线可视化,并显示原始灰度图和检测结果。
注意,我们使用`Vec4i` 类型来存储概率霍夫检测得到的直线。`Vec4i` 是一个长度为 4 的定长向量,分别表示直线的起点和终点坐标。