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

news2024/11/14 3:01:59

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

目录

  • 函数原理
    • 原理
    • cv::HoughLinesP()函数
  • 运行示例
    • 阈值为80
    • 阈值为200
  • 总结

函数原理

原理

霍夫直线检测(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,相应的最终结果为:
在这里插入图片描述

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1228603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode刷题-树】--100.相同的树

100.相同的树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C统计数 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个数的序列S&#xff0c;以及一个区间[L, R], 求序列…

Codeforces Round 910 (Div. 2)(D~F)

1898D - Absolute Beauty 题意&#xff1a;给定长度为n的数组a和b&#xff0c;定义b数组的价值为&#xff0c;现可以交换一次b数组中的任意两个元素&#xff0c;求b数组的价值最大值。 思路&#xff1a;绝对值问题可以放在数轴上去解决。绝对值即为区间长度 观察上述三种情况&…

认识.NET Aspire:高效构建云原生应用的利器

简介 在几天前的.NET 8发布会上&#xff0c;来自微软的Glenn Condron和David Fowler为我们演示了.NET Aspire&#xff0c;在Visual Studio的帮助下&#xff0c;它展现出了惊人的开发效率。 短短的十分钟内&#xff0c;David现场演示了如何轻松创建了一个具有服务发现&#xf…

汽车标定技术--A2L格式分析

目录 1.A2L由来 2.A2L格式 2.1 PROJECT 2.2 MODULE中包含的内容 3. INCA和CANape兼容吗&#xff1f; 最近有朋友用Vector ASAP2Editor编译的A2L文件在INCA7.4中无法识别&#xff0c;我记得以前做的时候是可以识别的&#xff0c;难不成最近有什么变动吗&#xff1f;出于好…

JavaScript的学习,就这一篇就OK了!(超详细)

目录 Day27 JavaScript(1) 1、JS的引入方式 2、ECMAScript基本语法 3、ECMAScript 基本数据类型​编辑 3.1 数字类型 3.2 字符串 3.3 布尔值 3.4 空值&#xff08;Undefined和Null&#xff09; 3.5 类型转换 3.6 原始值和引用值 4、运算符 5、流程控制语句 5.1 分…

云原生微服务-理论篇

文章目录 分布式应用的需求分布式架构治理模式演进ESB 是什么&#xff1f;微服务架构 MSA微服务实践细节微服务治理框架sidercar 什么是service mesh&#xff1f;康威定律微服务的扩展性什么是MSA 架构&#xff1f;中台战略和微服务微服务总体架构组件微服务网关服务发现与路由…

ps找不到msvcp140.dll怎么办?亲测5个有效的修复方法分享

运行Photoshop时提示找不到MSVCP140.dll&#xff0c;这是因为计算机MSVCP140.dll文件丢失或者损坏。msvcp140.dll是微软Visual C 2015运行库的一部分&#xff0c;它包含了许多用于支持C运行的函数和类。当我们在使用某些程序时&#xff0c;如果这个程序依赖于msvcp140.dll&…

【c++随笔13】多态

【c随笔13】多态 多态性&#xff08;Polymorphism&#xff09;在面向对象编程中是一个重要概念&#xff0c;它允许以统一的方式处理不同类型的对象&#xff0c;并在运行时动态确定实际执行的方法或函数。一、什么是多态性&#xff1f;1、关键概念&#xff1a;C的多态性2、多态定…

构造函数,原型对象,实例对象

1.构造函数、原型对象、实例对象三者分别是什么&#xff1f; 构造函数&#xff1a;用来创建对象的函数&#xff0c;创建实例对象的模板 。构造函数的函数名尽量首字母大写(为了区分普通函数和构造函数)原型对象&#xff1a;每一个函数在创建的时候&#xff0c;系统都会给分配一…

【Android Jetpack】DataStore的介绍

DataStore Jetpack DataStore是一种数据存储解决方案&#xff0c;允许您使用协议缓冲区存储键值对或类型化对象。DataStore使用Kotlin协程和Flow以异步、一致的事务方式存储数据。 注意&#xff1a;如果您需要支持大型或复杂数据集、部分更新或参照完整性&#xff0c;请考虑使…

【算法挨揍日记】day28——413. 等差数列划分、978. 最长湍流子数组

413. 等差数列划分 413. 等差数列划分 题目描述&#xff1a; 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums…

【wp】2023第七届HECTF信息安全挑战赛 Web

伪装者 考点&#xff1a;http协议flask的session伪造ssrf读取文件 首先根据题目要求就行伪造HTTP 这里不多说&#xff0c;比较基础 然后下面得到是个登入 页面&#xff0c;我们输入zxk1ing 得到 说什么要白马王子 &#xff0c;一眼session伪造 看到ey开头感觉是jwt 输入看看 得…

动态规划专项---最长上升子序列模型

文章目录 怪盗基德的滑翔翼登山合唱队形友好城市最大上升子序列和拦截导弹导弹防御系统最长公共上升子序列 一、怪盗基德的滑翔翼OJ链接 本题思路:本题是上升子序列模型中比较简单的模型&#xff0c;分别是从前往后和从后往前走一遍LIS即可。 #include <bits/stdc.h>co…

深度学习中的图像融合:图像融合论文阅读与实战

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 abs 介绍图像融合概念&#xff0c;回顾sota模型&#xff0c;其中包括数字摄像图像融合&#xff0c;多模态图像融合&#xff0c; 接着评估一些代表方法 介绍一些常见应用&#xff0c;比如RGBT目标跟踪&#xff0c;…

PgSQL技术内幕-Bitmap Index Scan

PgSQL技术内幕-Bitmap Index Scan 1、简介 Bitmap索引扫描是对索引扫描的一个优化&#xff0c;通过建立位图的方式将原来的随机堆表访问转换成顺序堆表访问。主要分为两点&#xff1a;1&#xff09;管理每个Bitmap的hash slot没用完时&#xff0c;每个Bitmap代表每个heap页中满…

LeetCode【92】翻转链表II

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/DarkAndGrey/article/details/122146216 public ListNode reverseBetween(ListNode head, int left, int right) {if(head null || right left){return head;// 头节点为null&#xff0c;链表为空&#xff0c;反…

340条样本就能让GPT-4崩溃,输出有害内容高达95%?OpenAI的安全防护措施再次失效

仅需340个示例微调GPT-4&#xff0c;即可绕过安全限制&#xff0c;让模型说出“枪支改装方法”、“生化武器制作过程”等有害内容&#xff1f; OpenAI的安全防护措施再次失效&#xff0c;攻击的成功率高达95%&#xff01; 近日&#xff0c;美国顶尖大学UIUC与斯坦福联合对GPT…

华为麒麟服务器--硬盘问题

记录以下今天处理的服务器&#xff1a; 情况说明&#xff1a;linux 系统&#xff0c;不知道什么原因系统就突然不能用了&#xff08;据说是前段时间断电来着&#xff0c;但是机房有应急电源&#xff09;。 系统环境&#xff1a; 服务器&#xff1a;华为RH2288H V3 服务器 服…

(数据库管理系统)DBMS与(数据库系统)DBS的区别

数据库管理系统&#xff08;DBMS&#xff0c;Database Management System&#xff09;和数据库系统&#xff08;DBS&#xff0c;Database System&#xff09;是两个相关但不同的概念。 DBS是一个更广泛的概念&#xff0c;指的是计算机系统引入数据库后的系统&#xff0c;包括数…