OpenCV CUDA模块霍夫变换------在 GPU 上执行概率霍夫变换检测图像中的线段端点类cv::cuda::HoughSegmentDetector

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::cuda::HoughSegmentDetector 是 OpenCV 的 CUDA 模块中一个非常重要的类,它用于在 GPU 上执行 概率霍夫变换(Probabilistic Hough Transform),能够检测图像中的线段端点(即直线段),而不是标准霍夫变换中表示为 (rho, theta) 的无限长直线。

类定义

cpp 复制代码
class cv::cuda::HoughSegmentDetector : public cv::cuda::Algorithm

继承自 cv::cuda::Algorithm,提供了 GPU 加速的线段检测功能。

主要功能

  • 在 GPU 上进行 概率霍夫变换
  • 输出为一系列 线段端点,格式为 Vec4i(x1, y1, x2, y2)
  • 支持边缘图作为输入(通常是 Canny 边缘检测后的图像)

构造函数 & 创建方式

你可以通过以下方式创建该类的对象:

cpp 复制代码
cv::Ptr<cv::cuda::HoughSegmentDetector> hough = 
    cv::cuda::createHoughSegmentDetector(rho, theta, threshold, minLineLength, maxLineGap);

参数说明:

参数名 类型 含义
rho float 距离分辨率(像素)
theta float 角度分辨率(弧度)
threshold int 投票阈值,只有投票数大于等于此值的线段才被保留
minLineLength int 线段最小长度,小于该值的线段将被忽略
maxLineGap int 同一线段上点之间的最大间隙

方法列表(常用方法)

方法名 功能
detect(InputArray src, OutputArray lines, Stream& stream = Stream::Null()) 执行霍夫变换检测线段
setRho(float rho) / getRho() 设置/获取距离分辨率
setTheta(float theta) / getTheta() 设置/获取角度分辨率
setThreshold(int threshold) / getThreshold() 设置/获取投票阈值
setMinLineLength(int minLineLength) / getMinLineLength() 设置/获取线段最小长度
setMaxLineGap(int maxLineGap) / getMaxLineGap() 设置/获取线段最大间隙

代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>

int main()
{
    // Step 1: 加载图像并转为灰度图
    cv::Mat h_src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/lines.png", cv::IMREAD_GRAYSCALE);
    if (h_src.empty()) {
        std::cerr << "无法加载图像!" << std::endl;
        return -1;
    }

    // Step 1.1: 图像预处理(高斯模糊降噪)
    cv::Mat h_blur;
    cv::GaussianBlur(h_src, h_blur, cv::Size(5, 5), 0);

    // Step 2: 上传到 GPU 并执行 Canny 边缘检测
    cv::cuda::GpuMat d_src, d_edges;
    d_src.upload(h_blur);

    cv::Ptr<cv::cuda::CannyEdgeDetector> canny = cv::cuda::createCannyEdgeDetector(100, 200);
    canny->detect(d_src, d_edges);

    // Step 3: 创建概率霍夫变换检测器
    float rho         = 1.0f;            // 距离分辨率
    float theta       = CV_PI / 180.0f;  // 角度分辨率(1 度)
    int threshold     = 30;              // 投票阈值(更敏感)
    int minLineLength = 50;              // 最小线段长度(更短也保留)
    int maxLineGap    = 20;              // 线段之间最大间隙(容许更大间隙)

    cv::Ptr<cv::cuda::HoughSegmentDetector> hough =
        cv::cuda::createHoughSegmentDetector(rho, theta, threshold, minLineLength, maxLineGap);

    // Step 4: 执行线段检测
    cv::cuda::GpuMat d_lines;
    hough->detect(d_edges, d_lines);

    // Step 5: 下载结果
    std::vector<cv::Vec4i> h_lines;
    d_lines.download(h_lines);

    // Step 6: 绘制检测到的线段
    cv::Mat display;
    cv::cvtColor(h_src, display, cv::COLOR_GRAY2BGR);

    for (const auto& line : h_lines)
    {
        cv::Point pt1(line[0], line[1]);
        cv::Point pt2(line[2], line[3]);
        cv::line(display, pt1, pt2, cv::Scalar(0, 255, 0), 2);
    }

    // Step 7: 显示结果
    cv::imshow("Detected Line Segments", display);
    cv::waitKey();

    return 0;
}

运行结果

相关推荐
沧沧凉凉2 分钟前
让我退掉 Claude 的不是代码能力,是一张图
人工智能·游戏·ai编程
新知图书15 分钟前
第 6 章DeepSeek的Function Calling与MCP应用实战
人工智能·智能体
xn713328 分钟前
Funes Agent Memory 实测:Codex 长期记忆召回、旧记忆污染与 no-answer 边界
人工智能·llm·ai编程
天空属于哈夫克335 分钟前
企业微信AI开发:如何让AI根据用户消息自动生成回复?
人工智能·microsoft
Raas10037 分钟前
AI网关和LiteLLM区别在哪?MAI Gateway(魔芋企业级AI网关)统一治理方案深度解析
大数据·人工智能·gateway·mai gateway·企业级产品
GlobalInfo42 分钟前
2026新能源汽车线束研究报告:市场规模与十五五风向
大数据·人工智能·新能源
William一直在路上1 小时前
GPT-6 Astra 研究报告——模型能力、API 演进与 Agent/MCP 生态影响分析
人工智能·gpt·llm·openai·astra
tntxia1 小时前
AI 应用开发生产落地实践指南
人工智能
林墨聊AIGC1 小时前
AI视频怎么做跳舞的动作效果:从入门到精通的舞蹈动画制作指南
大数据·人工智能·自动化·aigc·音视频
IT_陈寒1 小时前
Vite静态资源路径这个大坑害我调了一下午
前端·人工智能·后端