OpenCV C++ 直线检测教程:使用 Canny 和 HoughLines 算法
本教程将使用 OpenCV 和 C++ 代码演示如何检测图像中的直线。我们将利用 Canny 边缘检测器和 HoughLines 算法来识别并绘制直线。
Canny 函数
Canny 函数是 OpenCV 中用于边缘检测的函数,其使用方法为:
Canny(src, edges, threshold1, threshold2, apertureSize, L2gradient);
参数含义如下:
src: 输入图像,必须为单通道 8 位图像。edges: 输出的边缘图像,为单通道 8 位图像。threshold1: 第一个阈值,用于控制边缘的强度。threshold2: 第二个阈值,用于控制边缘的弱度。apertureSize: Sobel 算子的大小,取值为 3、5、7 等。L2gradient: 表示是否使用 L2 范数计算梯度幅值,取值为 true 或 false。
HoughLines 函数
对于直线检测,可以在 Canny 函数之后使用 HoughLines 函数进行直线检测,然后在原图上绘制检测到的直线。
HoughLines(edges, lines, 1, CV_PI/180, threshold);
参数含义如下:
edges: 输入的边缘图像,必须为单通道 8 位图像。lines: 输出的直线参数,每个元素包含两个值:角度和距离。rho: 距离分辨率,单位为像素。theta: 角度分辨率,单位为弧度。threshold: 累加器阈值,用于控制直线检测的灵敏度。
代码示例
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
// 加载图像
Mat image = imread("image.jpg");
// 转化为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 进行 Canny 边缘检测
Mat edges;
Canny(gray, edges, 50, 200, 3);
// 进行 HoughLines 直线检测
vector<Vec2f> lines;
HoughLines(edges, lines, 1, CV_PI/180, 100);
// 在原图上绘制检测到的直线
for (size_t i = 0; i < lines.size(); i++) {
float rho = lines[i][0];
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(image, pt1, pt2, Scalar(0, 255, 0), 2, LINE_AA);
}
// 显示结果
imshow("检测结果", image);
waitKey(0);
return 0;
}
注意事项
- Canny 和 HoughLines 函数的参数需要根据具体图像进行调整,以获得最佳的检测效果。
- 代码中使用
line函数绘制直线,可以使用不同的颜色和线宽来进行调整。
总结
本教程介绍了如何使用 OpenCV 和 C++ 代码检测图像中的直线。通过使用 Canny 和 HoughLines 函数,我们可以有效地识别和绘制图像中的直线。
原文地址: https://www.cveoy.top/t/topic/jxIL 著作权归作者所有。请勿转载和采集!