OpenCV学习笔记之十一——霍夫变换(霍夫线变换,霍夫圆变换)
边缘检测:使用Canny边缘检测获取图像边缘。 梯度计算:利用Sobel算子计算局部梯度,确定切线方向。 累加器更新:根据梯度方向更新累加器,找出圆心候选。 圆心筛选:根据累加器值和距离阈值筛选最可靠的圆心。 半径确定:通过非零像素支持度确定最优半径。
发布日期:2025-06-18 16:41:46
浏览次数:3
分类:精选文章
本文共 2694 字,大约阅读时间需要 8 分钟。
霍夫变换与霍夫圆变换技术详解
一、霍夫变换概述
霍夫变换是一种图像处理技术,广泛应用于直线检测、曲线识别等领域。其核心思想是在参数空间中通过累加运算找到符合特定形状的曲线集合。霍夫变换最初由Paul Hough提出,后经Richard Duda和Peter Hart的改进,逐渐发展成为用于多种形状识别的重要工具。
1.1 霍夫线变换
霍夫线变换专注于直线检测,适用于边缘二值图像。OpenCV提供三种霍夫线变换:
- 标准霍夫变换(SHT):由
HoughLines函数实现,适用于经典霍夫线变换。 - 多尺度霍夫变换(MSHT):基于标准霍夫变换的多尺度扩展,通过
HoughLines函数调用。 - 累计概率霍夫变换(PPHT):通过
HoughLinesP函数实现,优化了标准霍夫变换的效率。
1.2 霍夫圆变换
霍夫圆变换扩展至圆形物体识别,需要处理三个空间参数:圆心坐标和半径。OpenCV中采用“霍夫梯度法”来实现圆变换,通过边缘检测和梯度计算,逐步筛选圆心候选,最终确定圆形区域。
二、霍夫变换原理
2.1 参数空间转换
霍夫变换将直线表示为极坐标形式:
- 直线表示:极径ρ和极角θ表示直线。
- 点对应的曲线:每个点对应一族直线,形成极坐标曲线。
2.2 曲线交点检测
霍夫变换通过检测参数空间中的交点来确定直线或圆。对于直线,交点数量超过阈值即可确认直线存在;对于圆,需要同时满足圆心和半径条件。
三、霍夫线变换函数详情
3.1 HoughLines函数
- 函数定义:
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0)
- 参数说明:
image:输入图像,需转换为8位单通道二进制图像。lines:输出直线集合,每条线由两个点表示。rho:直线搜索的半径步长。theta:直线搜索的角度步长。threshold:交点累加值阈值。srn、stn:多尺度参数,用于控制累加器步长。
3.2 HoughLinesP函数
- 函数定义:
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)
- 参数说明:
image:输入图像,需转换为8位单通道二进制图像。lines:输出直线集合,每条线由四个点表示端点。rho:直线搜索的半径步长。theta:直线搜索的角度步长。threshold:交点累加值阈值。minLineLength:直线最小长度,过短的线段不显示。maxLineGap:直线最大间距,避免过长的线段重复。
四、霍夫圆变换实现
4.1 HoughCircles函数
- 函数定义:
void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0)
- 参数说明:
image:输入图像,需为8位灰度单通道图像。circles:输出圆集合,每个圆由圆心坐标和半径表示。method:检测方法,目前仅支持CV_HOUGH_GRADIENT。dp:累加器分辨率与输入图像的比率。minDist:圆心最小距离,避免近似圆重复检测。param1、param2:边缘检测参数,影响圆的可靠性。minRadius、maxRadius:圆的半径范围。
4.2 实现步骤
五、代码实现示例
#include#include #include using namespace std;using namespace cv;Mat Img_scr, Img_gray, Img_Canny, Img_BGR;Mat Img_scr1, Img_gray1, Img_dst;void callback_houghlines(int, void*) { static int threshold_val = 110; // 使用HoughLinesP函数检测直线 vector lines; HoughLinesP(Img_Canny, lines, 1, CV_PI/180, threshold_val, 30, 10); // 绘制检测到的直线 for (size_t i = 0; i < lines.size(); ++i) { Vec4i L = lines[i]; line(Img_BGR, Point(L[0], L[1]), Point(L[2], L[3]), Scalar(60, 50, 180), 1); } imshow("HoughLinesP", Img_scr);}int main() { threshold_val = 110; Img_scr = imread("build.jpg"); Img_Canny = Canny(Img_scr, 50, 200, 3); namedWindow("HoughLinesP"); createTrackbar("threshold", "HoughLinesP", &threshold_val, 320, callback_houghlines); return 0;}
六、效果展示
通过上述代码,可以实现实时直线检测,用户可以通过滚动条调整阈值,观察不同直线检测结果。代码结构清晰,注释详细,便于理解和修改。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2026年05月30日 01时41分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php 特定时间段统计,jpgraph某个时间段的数据统计
2023-02-28
php 生成csv mac下乱码
2023-02-28
php 生成证书 签名及验签
2023-02-28
PHP 的标准输入与输出
2023-02-28
php 笔记 (早前的,很乱)
2023-02-28
PHP 第一天
2023-02-28
Redis使用量暴增,快速定位有哪些大key在作怪
2023-02-28
PHP 统计数据功能 有感
2023-02-28
SpringBoot处理JSON数据
2023-02-28
PHP 输入输出流合集
2023-02-28
php--防止sql注入的方法
2023-02-28
php-兔子问题,斐波那契数列
2023-02-28
php-约瑟夫问题
2023-02-28
php.ini中常见的配置信息选项
2023-02-28
php.ini配置中有10处设置不当,会使网站存在安全问题
2023-02-28
PHP7 新特性
2023-02-28
PHP7+MySQL5.7+Nginx1.9. on Ubuntu 14.0
2023-02-28
php7.1.6 + redis
2023-02-28
php7中使用php_memcache扩展
2023-02-28