当前位置: 首页 > article >正文

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) 的无限长直线。

类定义

class cv::cuda::HoughSegmentDetector : public cv::cuda::Algorithm

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

主要功能

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

构造函数 & 创建方式

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

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

参数说明:

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

方法列表(常用方法)

方法名功能
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()设置/获取线段最大间隙

代码示例

#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;
}

运行结果

在这里插入图片描述

http://www.lryc.cn/news/2398831.html

相关文章:

  • 详解一下RabbitMQ中的channel.Publish
  • 硬件学习笔记--62 MCU的ECC功能简介
  • Uiverse.io:免费UI组件库
  • 普中STM32F103ZET6开发攻略(四)
  • ck-editor5的研究 (5):优化-页面离开时提醒保存,顺便了解一下 Editor的生命周期 和 6大编辑器类型
  • [3D GISMesh]三角网格模型中的孔洞修补算法
  • 11.2 java语言执行浅析3美团面试追魂七连问
  • MySQL 全量、增量备份与恢复
  • 【25.06】FISCOBCOS使用caliper自定义测试 通过webase 单机四节点 helloworld等进行测试
  • MonoPCC:用于内窥镜图像单目深度估计的光度不变循环约束|文献速递-深度学习医疗AI最新文献
  • 如何计算H5页面加载时的白屏时间
  • SpringAI系列 - MCP篇(三) - MCP Client Boot Starter
  • 【深度学习新浪潮】以Dify为例的大模型平台的对比分析
  • Asp.net core 使用EntityFrame Work
  • isp中的 ISO代表什么意思
  • AI Coding 资讯 2025-06-03
  • 2024年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 3d GIS数据来源与编辑工具
  • NeRF PyTorch 源码解读 - 体渲染
  • SpringBoot 数据库批量导入导出 Xlsx文件的导入与导出 全量导出 数据库导出表格 数据处理 外部数据
  • 解决:install via Git URL失败的问题
  • OpenCV CUDA模块特征检测------创建Harris角点检测器的GPU实现接口cv::cuda::createHarrisCorner
  • 【氮化镓】钝化层对p-GaN HEMT阈值电压的影响
  • C++:优先级队列
  • 睡眠分期 html
  • Java求职者面试:Spring、Spring Boot、Spring MVC与MyBatis技术深度解析
  • Github 2025-05-29 Go开源项目日报Top9
  • 前端项目种对某个文件夹进行大小写更改,git识别不到差异导致无变化
  • AWS VPC 网络详解:理解云上专属内网的关键要素
  • Ubuntu24.04.2 + kubectl1.33.1 + containerdv1.7.27 + calicov3.30.0