OpenCV——概率霍夫检测

news/2024/10/17 22:18:17/

概率霍夫变换是一种基于泛洪算法的直线检测算法。相较于传统霍夫变换,概率霍夫变换可以在保证一定的精度前提下,大大提高了直线检测效率。下面是  OpenCV  C++  实现概率霍夫检测的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{Mat src, dst, color_dst;if (argc != 2 || !(src = imread(argv[1], IMREAD_GRAYSCALE)).data)return -1;Canny(src, dst, 50, 200, 3);cvtColor(dst, color_dst, COLOR_GRAY2BGR);vector4i> lines;HoughLinesP(dst, lines, 1, CV_PI / 180, 50, 50, 10);for (size_t i = 0; i < lines.size(); i++){Vec4i l = lines[i];line(color_dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);}namedWindow("Source", WINDOW_NORMAL);imshow("Source", src);namedWindow("Detected Lines", WINDOW_NORMAL);imshow("Detected Lines", color_dst);waitKey(0);return 0;
}

代码解释如下:

-  首先读入一张灰度图片并进行  Canny  边缘检测。

-  然后调用`cv::HoughLinesP`  函数进行概率霍夫检测,检测到的直线存储在`std::vector<Vec4i>`  中。

对于  HoughLinesP  函数几个参数的含义:

-`dst`:输入图像;
-`lines`:输出的直线集合;
-`1`:表示直线的检测步长,单位为像素;
-`CV_PI  /  180`:表示角度的检测步长,单位为弧度;
-`50`:表示累加阈值,累加值低于该值则被丢弃;
-`50`:表示最小线段长度,小于该值的线条会被丢弃;
-`10`:表示最大线段间隙,同一条线段中断的间隙超过该值则会被分为两条线段。

-  最后,将检测到的直线可视化,并显示原始灰度图和检测结果。

注意,我们使用`Vec4i`  类型来存储概率霍夫检测得到的直线。`Vec4i`  是一个长度为  4  的定长向量,分别表示直线的起点和终点坐标。


http://www.ppmy.cn/news/55576.html

相关文章

华为OD机试真题(Java),整数编码(100%通过+复盘思路)

一、题目描述 实现一个整数编码方法&#xff0c;使得待编码的数字越小&#xff0c;编码后所占用的字节数越小。 编码规则如下&#xff1a; 编码时7位一组&#xff0c;每个字节的低7位用于存储待编码数字的补码&#xff1b;字节的最高位表示后续是否还有字节&#xff0c;置1表…

《利用光体积描记图信号的模糊递推特性估计无袖带血压的级联卷积神经网络模型》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…

Java并发(三)----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

QSqlQuery简单使用

QSqlQuery简单使用 1 执行一个查询2 浏览查询结果3 插入、更新和删除记录关键代码 Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法程序所在路径当前工作目录用户目录路径我的文档路径桌面路径程序数据存放路径临时文件路径 Qt中路径问题小结 原文链接&…

c语言文件读写

原理 C语言文件读写的原理是&#xff0c;先打开文件&#xff0c;然后使用fread或fwrite函数读取或写入文件内容。 文件打开的方式有两种&#xff1a; 以写入模式打开文件&#xff0c;使用fopen()函数以"w"作为第一个参数&#xff0c;如果文件不存在则创建文件&…

20230427配置cv1826的buildroot在串口免登录的方法二

20230427配置cv1826的buildroot在串口免登录的方法二 2023/4/27 16:46 进度&#xff1a;可以拿掉密码&#xff0c;但是无法拿掉用户名&#xff01; 1、 Z:\buildroot1\buildroot\configs\cvitek_cv182x_defconfig BR2_TOOLCHAIN_EXTERNAL_GCC_6y BR2_TOOL…

简记二分算法模板与代码案例:整数二分和浮点数二分

本文以 Java 语言实现&#xff0c;整理的代码模板适用于编程竞赛。对代码模板原理的讲解不多&#xff0c;主要记录一下如何使用。 目录 一、算法模板 &#xff08;1&#xff09;整数二分 &#xff08;2&#xff09;浮点数二分 二、例题 例题&#xff1a;acwing-789.数的范…

详解达梦数据库字符串大小写敏感

检查数据库实例大小写敏感信息 场景一、初始化数据库实例为大小写敏感库 DDL操作 总结&#xff1a; 大小写敏感的数据库中&#xff1a; 创建表时&#xff1a; ①如果不对表名或列名添加""&#xff0c;那么表名和列名都自动转换为大写形式&#xff1b; ②如果对表…