OpenCV C++ 直线检测:使用 Canny 和 Hough 变换

本代码使用 OpenCV 和 C++,演示如何检测图像中的直线。它利用 Canny 边缘检测算法来找到边缘,然后使用 Hough 变换来检测直线。检测到的直线将用绿色标记,并在窗口中显示结果。

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv)
{
    // 读取图片
    Mat img = imread('test.jpg');

    // 灰度化
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // 边缘检测
    Mat edges;
    Canny(gray, edges, 50, 200, 3);

    // 直线检测
    std::vector<Vec2f> lines;
    HoughLines(edges, lines, 1, CV_PI/180, 150, 0, 0);

    // 绘制直线
    Mat dst = img.clone();
    for (size_t i = 0; i < lines.size(); i++)
    {
        float rho = lines[i][0], 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(dst, pt1, pt2, Scalar(0, 255, 0), 3, LINE_AA);
    }

    // 显示结果
    imshow('Original Image', img);
    imshow('Edges', edges);
    imshow('Detected Lines', dst);
    waitKey();

    return 0;
}

代码解释:

  1. 读取图片: 使用 imread() 函数读取图像文件。
  2. 灰度化: 使用 cvtColor() 函数将图像转换为灰度图像。
  3. 边缘检测: 使用 Canny() 函数检测图像边缘。
  4. 直线检测: 使用 HoughLines() 函数检测图像中的直线。
  5. 绘制直线: 使用 line() 函数在原始图像上绘制检测到的直线。
  6. 显示结果: 使用 imshow() 函数显示原始图像、边缘检测结果和直线检测结果。

注意:

  • 代码中使用的 test.jpg 文件需要在程序运行的目录下。
  • 可以调整 Canny()HoughLines() 函数的参数来改变检测效果。
  • 此代码仅演示如何检测图像中的直线,具体的应用场景可能需要根据实际情况进行调整。
OpenCV C++ 直线检测:使用 Canny 和 Hough 变换

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

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