news 2026/9/27 4:23:09

OpenCVSharp:使用霍夫变换检测直线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCVSharp:使用霍夫变换检测直线

概述

霍夫变换(Hough Transform)是一种强大的计算机视觉技术,用于检测图像中的特定几何形状(如直线、圆形、椭圆等)。它通过将图像空间中的点映射到参数空间,将形状检测问题转换为参数空间中的峰值检测问题。对于直线检测,霍夫变换将图像中的每个边缘点映射到参数空间(ρ,θ)中的一条曲线,其中ρ表示直线到原点的距离,θ表示直线的角度。当多条曲线在参数空间中相交于同一点时,表明图像中存在对应的直线。这种方法的优点是对噪声和部分遮挡具有鲁棒性,能够检测不完整的形状,因此在道路检测、工业检测和文档分析等领域有广泛应用。

实践

// 读取图像 usingvar imgGray = new Mat(ImagePath, ImreadModes.Grayscale); usingvar imgStd = new Mat(ImagePath, ImreadModes.Color); usingvar imgProb = imgStd.Clone(); if (imgGray.Empty()) { MessageBox.Show("无法加载图像", "错误", MessageBoxButton.OK, MessageBoxImage.Error); return; } // 预处理 - Canny边缘检测 var sw = new Stopwatch(); sw.Start(); Cv2.Canny(imgGray, imgGray, CannyThreshold1, CannyThreshold2, 3, false); sw.Stop(); CannyTime = $"Canny边缘检测耗时: {sw.ElapsedMilliseconds} 毫秒 (阈值1={CannyThreshold1}, 阈值2={CannyThreshold2})"; CannyImage = ConvertMatToBitmapImage(imgGray); // 运行标准霍夫变换 sw.Start(); LineSegmentPolar[] segStd = Cv2.HoughLines(imgGray, 1, Math.PI / 180, (int)HoughThreshold, 0, 0); sw.Stop(); int limit = Math.Min(segStd.Length, 10); for (int i = 0; i < limit; i++) { // 绘制结果线条 float rho = segStd[i].Rho; float theta = segStd[i].Theta; double a = Math.Cos(theta); double b = Math.Sin(theta); double x0 = a * rho; double y0 = b * rho; Point pt1 = new Point { X = (int)Math.Round(x0 + 1000 * (-b)), Y = (int)Math.Round(y0 + 1000 * (a)) }; Point pt2 = new Point { X = (int)Math.Round(x0 - 1000 * (-b)), Y = (int)Math.Round(y0 - 1000 * (a)) }; imgStd.Line(pt1, pt2, Scalar.Red, 3, LineTypes.AntiAlias, 0); } StandardHoughTime = $"标准霍夫变换耗时: {sw.ElapsedMilliseconds} 毫秒 (检测到 {segStd.Length} 条线)"; StandardHoughImage = ConvertMatToBitmapImage(imgStd); // 运行概率霍夫变换 sw.Restart(); LineSegmentPoint[] segProb = Cv2.HoughLinesP(imgGray, 1, Math.PI / 180, (int)HoughThreshold, (int)MinLineLength, (int)MaxLineGap); sw.Stop(); foreach (LineSegmentPoint s in segProb) { imgProb.Line(s.P1, s.P2, Scalar.Red, 3, LineTypes.AntiAlias, 0); } ProbabilisticHoughTime = $"概率霍夫变换耗时: {sw.ElapsedMilliseconds} 毫秒 (检测到 {segProb.Length} 条线)"; ProbabilisticHoughImage = ConvertMatToBitmapImage(imgProb);

这个过程包含读取图像、Canny边缘检测、霍夫变换与概率霍夫变换。

Canny边缘检测

Canny边缘检测是一种多级边缘检测算法,由John F. Canny在1986年提出,被广泛认为是计算机视觉中最优秀的边缘检测方法之一。该算法通过四个主要步骤实现:首先使用高斯滤波器平滑图像以减少噪声,然后计算图像梯度的幅值和方向,接着应用非极大值抑制来细化边缘(保留梯度方向上的局部最大值),最后使用双阈值处理和滞后阈值技术来连接边缘并消除假边缘。Canny算法的优势在于它能够产生细而连续的边缘,具有良好的信噪比和定位精度,并且能够有效检测弱边缘,因此在图像分割、特征提取和物体识别等计算机视觉任务中得到广泛应用。

查看Cv2.Canny方法签名:

public static void Canny(InputArray src, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)

查看参数:

参数名

类型

默认值

说明

src

InputArray

无

单通道8位输入图像(通常为灰度图像)

edges

OutputArray

无

输出边缘图,与输入图像具有相同尺寸和类型的二值图像

threshold1

double

无

滞后阈值过程的第一个阈值(低阈值),用于边缘连接

threshold2

double

无

滞后阈值过程的第二个阈值(高阈值),用于强边缘检测

apertureSize

int

3

Sobel算子的孔径大小(3、5或7),决定梯度计算的核大小

L2gradient

bool

false

梯度幅值计算方法:true使用L2范数,false使用L1范数

阈值选择建议

典型比例:threshold2 ≈ 2-3 × threshold1

低阈值(threshold1):通常设置为50-100

高阈值(threshold2):通常设置为150-200

霍夫变换

霍夫变换(Hough Transform)是一种强大的计算机视觉技术,用于检测图像中的特定几何形状(如直线、圆形、椭圆等)。它通过将图像空间中的点映射到参数空间,将形状检测问题转换为参数空间中的峰值检测问题。对于直线检测,霍夫变换将图像中的每个边缘点映射到参数空间(ρ,θ)中的一条曲线,其中ρ表示直线到原点的距离,θ表示直线的角度。当多条曲线在参数空间中相交于同一点时,表明图像中存在对应的直线。

查看Cv2.HoughLines的方法签名:

public static LineSegmentPolar[] HoughLines( InputArray image, double rho, double theta, int threshold, double srn = 0, double stn = 0)

这是OpenCV中标准霍夫变换函数的实现,用于在二值图像中检测直线。

查看参数:

参数名

类型

默认值

说明

image

InputArray

无

8位单通道二值源图像,函数可能会修改此图像

rho

double

无

累加器的距离分辨率(像素单位)

theta

double

无

累加器的角度分辨率(弧度单位)

threshold

int

无

累加器阈值参数,只有获得足够投票数(>threshold)的直线才会被返回

srn

double

0

多尺度霍夫变换中距离分辨率rho的除数

stn

double

0

多尺度霍夫变换中角度分辨率theta的除数

注意看这个方法返回的是LineSegmentPolar[],LineSegmentPolar是OpenCV中用于表示极坐标直线的结构体。

属性名

类型

说明

Rho

float

直线的长度(从原点到直线的距离)

Theta

float

直线的角度(弧度)

得到的这个数组如下所示:

那么我们就要将霍夫变换检测到的极坐标直线转换为笛卡尔坐标,并在图像上绘制这些直线。

概率霍夫变换

概率霍夫变换(Probabilistic Hough Transform)是标准霍夫变换的一种优化改进版本,它通过随机采样和概率统计的方法大幅提高了直线检测的计算效率。与标准霍夫变换检测无限长直线不同,概率霍夫变换直接检测有限长度的线段,并返回线段的两个端点坐标,使结果更加实用。该算法通过最小线长和最大线间隙参数控制检测质量,只保留满足长度要求且连接性良好的线段,同时利用随机梯度上升策略减少计算量,使其在处理大图像或实时应用场景中具有明显优势,特别适用于道路检测、文档分析等需要快速准确检测线段的实际应用。

查看Cv2.HoughLinesP的方法签名:

public static LineSegmentPoint[] HoughLinesP( InputArray image, double rho, double theta, int threshold, double minLineLength = 0, double maxLineGap = 0)

这是OpenCV中概率霍夫变换函数的实现,用于在二值图像中检测线段。

查看参数:

参数名

类型

默认值

说明

image

InputArray

无

8位单通道二值源图像

rho

double

无

累加器的距离分辨率(像素单位)

theta

double

无

累加器的角度分辨率(弧度单位)

threshold

int

无

累加器阈值参数,只有获得足够投票数的线段才会被返回

minLineLength

double

0

最小线段长度,短于此长度的线段将被拒绝

maxLineGap

double

0

同一条线上点之间的最大允许间隙,用于连接断开的线段

返回的是LineSegmentPoint[],这是OpenCV中用于表示笛卡尔坐标线段的结构体,如下图所示:

然后使用Line方法绘制直线即可。

查看Line方法的签名:

public void Line(Point pt1, Point pt2, Scalar color, int thickness = 1, LineTypes lineType = LineTypes.Link8, int shift = 0)

查看参数:

参数名

类型

默认值

说明

pt1

Point

无

线段的第一个端点

pt2

Point

无

线段的第二个端点

color

Scalar

无

线段颜色

thickness

int

1

线段粗细(像素)

lineType

LineTypes

LineTypes.Link8

线段类型

shift

int

0

点坐标中的小数位数

最后的效果如下所示:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 7:18:06

RouterOS 7.19.2 arm64版本技术深度解析

RouterOS 7.19.2 arm64版本技术深度解析 【免费下载链接】MikroTikPatch 项目地址: https://gitcode.com/gh_mirrors/mikr/MikroTikPatch 随着网络基础设施的持续演进&#xff0c;MikroTik推出的RouterOS 7.19.2 arm64版本为嵌入式网络设备管理带来了突破性进展。该版本…

作者头像 李华
网站建设 2026/9/26 22:28:22

Vkvg:基于Vulkan的高性能2D图形库终极指南

Vkvg&#xff1a;基于Vulkan的高性能2D图形库终极指南 【免费下载链接】vkvg Vulkan 2D graphics library 项目地址: https://gitcode.com/gh_mirrors/vk/vkvg Vkvg是一个基于Vulkan图形API构建的高性能2D图形库&#xff0c;采用C语言开发&#xff0c;为现代应用提供快速…

作者头像 李华
网站建设 2026/9/26 17:22:16

InfluxDB 3.0时序数据库实战:从零搭建监控系统全流程

InfluxDB 3.0时序数据库实战&#xff1a;从零搭建监控系统全流程 【免费下载链接】influxdb Scalable datastore for metrics, events, and real-time analytics 项目地址: https://gitcode.com/gh_mirrors/inf/influxdb 还在为海量时序数据处理而头疼吗&#xff1f;Inf…

作者头像 李华
网站建设 2026/9/26 8:48:45

OpenCVSharp完全指南:在.NET生态中轻松构建智能视觉应用

OpenCVSharp完全指南&#xff1a;在.NET生态中轻松构建智能视觉应用 【免费下载链接】opencvsharp shimat/opencvsharp: OpenCvSharp 是一个开源的 C# 绑定库&#xff0c;它封装了 OpenCV&#xff08;一个著名的计算机视觉库&#xff09;&#xff0c;使得开发者能够方便地在 .N…

作者头像 李华
网站建设 2026/9/27 15:16:44

项目分享|TimesFM:谷歌推出的时间序列基础模型

引言 在时间序列预测领域&#xff0c;拥有高效、精准的模型至关重要。谷歌研究团队开发的TimesFM&#xff08;Time Series Foundation Model&#xff09;作为一款预训练的时间序列基础模型&#xff0c;为这一领域带来了新的解决方案。接下来&#xff0c;我们将深入了解这个备受…

作者头像 李华
网站建设 2026/9/27 11:43:13

【Open-AutoGLM数据脱敏全解析】:揭秘企业级隐私保护核心技术与实践路径

第一章&#xff1a;Open-AutoGLM数据脱敏的核心理念与架构设计Open-AutoGLM 是面向大语言模型场景构建的自动化数据脱敏框架&#xff0c;其核心理念在于实现敏感信息识别与处理的高精度、低延迟与可扩展性。系统采用分层解耦架构&#xff0c;将数据输入、敏感检测、脱敏策略执行…

作者头像 李华