本文共 2694 字,大约阅读时间需要 8 分钟。
霍夫变换是一种图像处理技术,广泛应用于直线检测、曲线识别等领域。其核心思想是在参数空间中通过累加运算找到符合特定形状的曲线集合。霍夫变换最初由Paul Hough提出,后经Richard Duda和Peter Hart的改进,逐渐发展成为用于多种形状识别的重要工具。
霍夫线变换专注于直线检测,适用于边缘二值图像。OpenCV提供三种霍夫线变换:
HoughLines
函数实现,适用于经典霍夫线变换。HoughLines
函数调用。HoughLinesP
函数实现,优化了标准霍夫变换的效率。霍夫圆变换扩展至圆形物体识别,需要处理三个空间参数:圆心坐标和半径。OpenCV中采用“霍夫梯度法”来实现圆变换,通过边缘检测和梯度计算,逐步筛选圆心候选,最终确定圆形区域。
霍夫变换将直线表示为极坐标形式:
霍夫变换通过检测参数空间中的交点来确定直线或圆。对于直线,交点数量超过阈值即可确认直线存在;对于圆,需要同时满足圆心和半径条件。
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
:多尺度参数,用于控制累加器步长。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
:直线最大间距,避免过长的线段重复。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
:圆的半径范围。#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;}
通过上述代码,可以实现实时直线检测,用户可以通过滚动条调整阈值,观察不同直线检测结果。代码结构清晰,注释详细,便于理解和修改。
转载地址:http://sgrfk.baihongyu.com/