本教程将使用 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 函数,我们可以有效地识别和绘制图像中的直线。

OpenCV C++ 直线检测教程:使用 Canny 和 HoughLines 算法

原文地址: https://www.cveoy.top/t/topic/jxIL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录