【C++】【Opencv】霍夫直线检测即cv::HoughLinesP()函数详解和示例

cv::HoughLinesP()(函数霍夫直线)功能分析是一种用于检测图像中直线的算法,它基于霍夫变换的原理。通过该算法,我们可以从图像中提取出直线信息,从而对图像进行分析和处理。主要经理边缘检测和霍夫直线处理两个步骤。本文通过示例对该函数进行详细解读,以帮助大家理解和使用。

函数原理

原理

霍夫直线检测(Hough Line Detection)是一种用于检测图像中直线的算法。它基于一个简单的事实:直线在图像中表现为一系列的点,这些点在霍夫空间中表现为峰值。
在实现霍夫直线检测时,通常分为两个步骤:

(1)边缘检测:首先对图像进行边缘检测,以获取所有可能形成直线的像素点。边缘检测可以通过各种算法(如Canny算法)来实现。Canny检测的介绍请参照canny详解和示例博客
(2)霍夫变换:然后对这些边缘像素点进行霍夫变换。霍夫变换的基本思想是将每个边缘像素点的梯度和角度映射到霍夫空间中。在霍夫空间中,每个可能的直线参数(斜率和截距)对应一个投票桶。如果一个边缘像素点对应的梯度和角度落在两个投票桶的边界上,则该像素点会给两个投票桶各投一票。最后,找到投票数最多的投票桶,其对应的直线参数即为检测到的直线。

cv::HoughLinesP()函数

cv::HoughLinesP() 是 OpenCV 库中的一个函数,用于在图像中检测和绘制线段。它基于霍夫变换(Hough Transform)的原理,通过检测图像中的边缘来识别线段。
函数原型:

void cv::HoughLinesP(
    InputArray image,
    OutputArray lines,
    double rho,
    double theta,
    int threshold,
    double minLineLength = 0,
    double maxLineGap = 0
);

参数解释:
image:输入的二值图像,通常是由边缘检测算法(如 Canny)得到的图像。
lines:输出参数,存储检测到的线段的端点信息。返回的是 N 个线段的向量,每个线段由两个点的向量构成。
rho:霍夫空间中坐标的分辨率,通常设置为1。
theta:角度的分辨率,通常设置为π/180。
threshold:判定直线点数量的阈值,阈值越高,检测到的线段越少。
minLineLength:线段的最小长度,小于此值的线段将被拒绝。默认值为0,表示不进行此检查。
maxLineGap:最大允许的线段间距,以使它们被视为单一线段。默认值为0,表示不进行此检查。

运行示例

由上面的介绍可知,threshold的设置关系着检测到线段的多少,因此,本部分将阈值分别设置为80和200进行对比实验。其中,使用的图像和代码均一致,进改变阈值参数值。图像原图为:
在这里插入图片描述

阈值为80

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat image = imread("tiegui.jpg", IMREAD_COLOR); // 读取输入图像
    Mat gray_image; cvtColor(image, gray_image, COLOR_BGR2GRAY); // 转换为灰度图像
    Mat edges_image; Canny(gray_image, edges_image, 100, 200); // 应用Canny边缘检测算法
    vector<Vec4i> lines; // 存储检测到的直线
    HoughLinesP(edges_image, lines, 1, CV_PI / 180, 80, 30, 10); // 应用霍夫直线检测算法
    for (size_t i = 0; i < lines.size(); i++)
    {
        Vec4i l = lines[i];
        line(image, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);
    }
    
    imshow("Edges", edges_image); // 显示检测到的边缘图像
    imwrite("tieguicanny.jpg", edges_image);
    imshow("Lines", image); // 显示检测到的直线
    imwrite("huofuline.jpg", image);
    waitKey(0); // 等待按键
    return 0;
}

在这个示例中,我们首先读取输入图像为灰度图,并使用 Canny 算法进行边缘检测。然后,我们使用 cv::HoughLinesP() 函数来检测边缘图像中的线段,并将检测到的线段存储在 lines 向量中。最后,我们遍历这个向量,并使用 cv::line() 函数在原始图像上画出检测到的线段,并保存相应的图像。
在这里插入图片描述
上图为Canny边缘检测结果。下图为霍夫直线cv::HoughLinesP()函数运处理结果。在这里插入图片描述

阈值为200

此部分,将代码中的80改变为200,相应的最终结果为:
在这里插入图片描述

总结

在霍夫直线功能分析中,我们可以通过设置不同的阈值和参数来控制检测直线的精度和鲁棒性。例如,我们可以调整投票机制中的阈值来控制检测到的直线数量。此外,我们还可以通过使用不同的边缘检测算法来影响检测结果的质量。
总的来说,霍夫直线功能分析是一种非常有用的算法,它可以用于各种应用场景中,如目标检测、机器人导航、交通监控等。通过该算法,我们可以从图像中提取出直线的信息,从而对图像进行分析和处理。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
霍夫直线变换是一种在图像中检测直线的经典算法,在OpenCV中也有相应的实现。根据引用,可以使用OpenCVC++接口来实现霍夫直线检测。首先,需要将图像转换为灰度图像,并进行边缘检测,可以使用Canny算子来实现。然后,使用HoughLines函数进行霍夫直线检测,该函数会返回检测到的直线的参数。接下来,将检测到的直线在原图像上进行绘制,可以使用line函数来实现。最后,得到的结果即为检测到的直线。可以参考引用中给出的代码示例来实现。在引用中,介绍了OpenCV的Python接口中的概率霍夫直线检测函数cv2.HoughLinesP()。该函数相比于HoughLines函数有一些变化,它采用了概率挑选机制,不需要计算所有的点,可以降低计算量。该函数的参数包括rho、theta、threshold、minLineLength和maxLineGap等,通过调整这些参数可以得到不同的检测结果。可以参考引用中给出的代码示例来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python+opencv实现霍夫变换检测直线](https://download.csdn.net/download/weixin_38627826/12865373)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [OpenCV3图像处理——霍夫曼变换直线检测](https://blog.csdn.net/matt45m/article/details/89193140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [opencv霍夫直线检测](https://blog.csdn.net/weixin_38956024/article/details/93642101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值