opencv c++ 霍夫直线检测

news2024/9/19 10:49:54

目的:在进行图像边缘提取后,将数据从平面坐标转换到极坐标空间,即完成了直线的信息提取。

1、原理

        平面坐标系:通过之间的斜率k截距b来确定一条直线。y = kx+b

        极坐标系:通过半径r角度θ来确定一条直线。r = xcosθ + y sinθ

注:在图像处理中,定义的平面坐标原点位于左上角,横轴为x,右方向为正方向,纵轴为y,下方向为正方向

        对于直线上任意一点(x_{0}, y_{0}),都有:

        

        对于任意点(x_{0}, y_{0}),经过它的线有无数:

        

        将其通过公式转换为极坐标的形式,这些线就变成了θ-r坐标系上的一系列点:

        

         当引入其他点后,通过极坐标的曲线交点就能确定这些点所处的直线的r、θ信息。:

        

        注:在实际算法中,会设定一个阈值T,当相交于同一点的点确定的曲线数量大于T时,才将这条被确定直线纳入统计,反之则排除它。

参考:(36条消息) 霍夫直线检测原理详解_秃头小苏的博客-CSDN博客_霍夫直线

2、API

 OpenCV: Feature Detection

这两个计算直线的API的输出均为 vector<Vec3f>形式,分别储存距离、角度、累加值(用于判断该直线是否纳入统计)。 


void cv::HoughLines	(	InputArray 	image,
                        OutputArray 	lines,
                        double 	rho,
                        double 	theta,
                        int 	threshold,
                        double 	srn = 0,
                        double 	stn = 0,
                        double 	min_theta = 0,
                        double 	max_theta = CV_PI 
                        )	

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

image——二值化后的图像。
lines——输出的直线信息, vector<Vec3f>/vector<Vec4i> 形式,分别储存距离、角度、累加值(用于判断该直线是否纳入统计)
rho——距离步长
theta ——角度步长
threshold ——累加值阈值,只统计交点累计格式大于该值的直线。
srn    ——用于多阶霍夫变换, it is a divisor for the distance resolution rho . The coarse accumulator distance resolution is rho and the accurate accumulator resolution is rho/srn . If both srn=0 and stn=0 , the classical Hough transform is used. Otherwise, both these parameters should be positive.
stn     ——用于多阶霍夫变换, it is a divisor for the distance resolution theta.
min_theta ——最小角度阈值
max_theta ——最大角度阈值。Must fall between min_theta and CV_PI. 

minLineLength    Minimum line length. Line segments shorter than that are rejected.
maxLineGap    ——当直线有间断时,认为互相间断的两条直线为同一直线的允许最大像素间隔数。

 HoughLines    与 HoughLinesP    区别:

HoughLines    输出 vector<Vec3f>,HoughLinesP    输出vector<Vec4i>,直线两个端点坐标,顺序为x1,y1, x2, y2。

void QuickDemo::hough_line_detect(Mat& image)
{
	GaussianBlur(image, image, Size(3, 3), 0);
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);

	vector<vector<Point>> contours;
	vector<Vec4i> hierachy;
	findContours(binary, contours, hierachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());

	//霍夫直线检测
	vector<Vec3f> lines;
	HoughLines(binary, lines, 1, CV_PI / 180.0, 300, 0, 0);

	//绘制检测出的直线
	Point ptz1, ptz2;
	for (size_t i = 0; i < lines.size(); ++i) {
		float rth = lines[i][0];//距离
		float theta = lines[i][1];//角度
		float accu = lines[i][2];//累加值
		//cout << "rth:" << rth << ",theta:" << theta << ",accu:" << accu << endl;

		double a = cos(theta);
		double b = sin(theta);
		double x0 = a * rth, y0 = b * rth;

		ptz1.x = cvRound(x0 + 1000 * (-b));
		ptz1.y = cvRound(y0 + 1000 * (a));
		ptz2.x = cvRound(x0 - 1000 * (-b));
		ptz2.y = cvRound(y0 - 1000 * (a));
		//line(image, ptz1, ptz2, Scalar(255, 0, 0), 2, 8);
		//根据角度给线不同的颜色
		int angle = round((theta / CV_PI) * 180);
		if (rth > 0) {
			line(image, ptz1, ptz2, Scalar(255, 0, 0), 2, 8);
			if(angle == 90)
				line(image, ptz1, ptz2, Scalar(0, 255, 255), 2, 8);
			if(angle < 1)
				line(image, ptz1, ptz2, Scalar(0, 255, 255), 2, 8);
		}
		else
			line(image, ptz1, ptz2, Scalar(0, 255, 0), 2, 8);
	}
	namedWindow("hough line", WINDOW_FREERATIO);
	imshow("hough line", image);
}

void QuickDemo::hough_P_line_detect(Mat& image)
{
	Mat gray, binary;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Canny(gray, binary, 80, 160, 3, false);
	namedWindow("Canny", WINDOW_FREERATIO);
	imshow("Canny", binary);

	vector<Vec4i> lines;
	HoughLinesP(binary, lines, 1, CV_PI / 180.0, 80, 30, 10);
	Mat result = Mat::zeros(image.size(), image.type());
	for (int i = 0; i < lines.size(); ++i) {
		line(result, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(0, 255, 0),2, 8);

	}
	namedWindow("hough P", WINDOW_FREERATIO);
	imshow("hough P", result);

}

 

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

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

相关文章

计算机毕业设计基于Springboot+vue口腔牙科诊所管理系统

项目介绍 口腔卫生是关系民生的一个重要问题。口腔健康会直接影响全身的健康&#xff0c;口腔基本常见的有龋齿&#xff0c;牙周炎等问题&#xff0c;而且人类的牙齿只有2次更换周期&#xff0c;一旦牙齿彻底完成更换终生将不再更换&#xff0c;所以越来越多的人开始关系口腔问…

C++中的多态和虚函数及多态原理

定义 多态&#xff1a;事物的一种形态&#xff0c;在不同的子类中表现为多种形态&#xff0c;就称为多态&#xff1b; 分类 多态分为静态和动态多态 静态多态包括运算符重载和函数重载&#xff0c;复用函数名&#xff1b; 动态多态包括虚函数派生类&#xff1b; 区别&…

【Flask框架】——03 应用程序的参数加载

目录1.从配置对象中加载2.从配置文件中加载3.从环境变量中加载4.从Pycharm中的运行时设置环境变量的方式加载5.企业项目开发常用的方式应用程序配置参数设置的是一个Web应用工程的相关信息&#xff0c;比如&#xff1a; 数据库的连接信息 日志的配置信息 自定义的配置信息 ……

【苹果家庭推源码】利用新的Alloc Replication方法建立一个对象

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

[Database] 脏读、幻读这些都是什么?事务隔离级别又是什么?MySQL数据库的事务隔离级别都有哪些?

文章目录前言事务隔离级别三种数据不一致问题1. 脏读2. 不可重复读3. 幻读不可重复读 vs 幻读四种事务隔离级别1. READ UNCOMMITTED2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE不同事务隔离级别会面临的问题不同隔离事务级别的使用率排名实战查看事务隔离级别更改事务…

linux篇【11】:计算机网络—网络基础

目录 一.网络基础 1.认识 "协议" 2.协议分层 &#xff08;1&#xff09;软件分层 &#xff08;2&#xff09;协议分层 3.OSI七层模型 4.TCP/IP五层(或四层)模型 5.网络和操作系统之间的关系 6.数据包的封装(封包)和解包&#xff0c;分用 &#xff08;1&…

四、文件管理(一)文件系统基础

目录 1.1文件的基本概念 1.2文件控制块和索引结点 1.3文件的操作 1.4文件保护 1.5文件的逻辑结构 1.5.1无结构文件&#xff08;流式文件&#xff09; 1.5.2有结构文件&#xff08;记录式文件&#xff09; 1.5.2.1顺序文件 1.5.2.2索引文件 1.5.2.3索引顺序文件 1.5…

数据库之架构

一、数据库架构原则 高可用 高性能 一致性 扩展性 二、常见的架构方案 方案一&#xff1a;主备架构&#xff0c;只有主库提供读写服务&#xff0c;备库冗余作故障转移用 jdbc:mysql://vip:3306/xxdb 1、高可用分析&#xff1a;高可用&#xff0c;主库挂了&#xff0c;kee…

[ vulhub漏洞复现篇 ] Apache Solr RemoteStreaming 文件读取与SSRF漏洞 (CVE-2021-27905)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

C++11特性-易用性改进

1.字符串的原始字面量 表达式&#xff1a;R"xxx&#xff08;原始字符串&#xff09;xxx"或者R"(原始字符串)"&#xff0c;xxx要写的话&#xff0c;必须一样 //两种申明形式string a "aaa";//没有转义的时候就是原始字面量string b R"aaa(…

总体设计阶段复习

总体设计总体设计(概要设计/初步设计):确定系统模块及相互关系,划分程序,文件,数据库,文档等物理元素设计原理:启发规则图形工具:面向数据流设计方法(SD)总体设计(概要设计/初步设计):确定系统模块及相互关系,划分程序,文件,数据库,文档等物理元素 系统设计阶段 数据流图分析方…

一篇五分生信临床模型预测文章代码复现——Figure 4-6 临床模型构建(六)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

FineReport智能数据图表- 文本域控件

1. 概述 1.1 版本 报表服务器版本 11.0 1.2 应用场景 1.2.1 填报控件 填报报表中可以通过该控件输入多行文本信息&#xff0c;录入填报的数据&#xff0c;如下图所示&#xff1a; 1.2.2 参数控件 参数面板处可以通过该控件输入多行文本信息&#xff0c;键入查询参数&#…

【车载开发系列】UDS诊断---安全访问服务($0x27)

【车载开发系列】UDS诊断—安全访问服务($0x27) UDS诊断---安全访问服务($0x27【车载开发系列】UDS诊断---安全访问服务($0x27)一.概念定义二.安全控制过程三.报文格式1&#xff09;请求种子2&#xff09;发送密钥3&#xff09;否定响应四.否定响应码列表五.参数定义六.注意事项…

JavaScript基础学习

文章目录什么是JavaScriptJavaScript 运行过程JvaScript 的组成JavaScript的三种书写模式行内式内嵌式外部式JavaScript的输出输出方式输入: prompt输出: alert输出: console.logJavaScript的一些基础语法变量的使用如何理解JS的动态类型&#xff08;弱类型&#xff09;基本数据…

SSM整合:mybatis层-P17

首先构建新的项目。 MYSQL&#xff1a; 在mysql中创建我们需要的表 CREATE DATABASE ssmbuild;USE ssmbuild;DROP TABLE IF EXISTS books;CREATE TABLE books ( bookID INT(10) NOT NULL AUTO_INCREMENT COMMENT 书id, bookName VARCHAR(100) NOT NULL COMMENT 书名, bookCo…

【深入浅出Spring原理及实战】「IOC容器初始化」彻底让你明白和理解运行原理和源码流程

前言介绍 本篇文章篇幅较大&#xff0c;希望读者可以慢慢阅读&#xff0c;建议收藏&#xff0c;分多次阅读学习。 学习源码的过程当中&#xff0c;有几点建议&#xff1a; 一定要学会抓重点&#xff0c;归纳核心类、核心方法、核心步骤&#xff1b; 分析源码我们不需要太过于纠…

MongoDB 存储引擎

简单回顾 上次我们说到了关于 mongodb 的集群&#xff0c;分为主从集群和分片集群&#xff0c;对于分片集群中的分片这里需要注意如下几点&#xff0c;一起来回顾一下&#xff1a; 对于热点数据某些分片键&#xff08;分片键是集合中每个文档中存在的索引字段或复合索引字段&a…

qt历史数据管理模块(模块化程序)功能块复制直接使用不冲突

一、前言 qt对历史数据管理部分个人总结的模块化程序&#xff0c;直接按照步骤复制粘贴程序&#xff0c;直接实现历史数据管理功能&#xff0c;无需花费脑筋在理清各个思路&#xff0c;适合快速编写组装程序 二、环境 windows qt5.7 sqlite3 三、正文 建议参照前文&…

【uni-app】uni-app之云开发uniCloud跨全栈开发笔记总结,包括一个 schema自动生成代码小案例(附详细截图)

1- 前言 本文主要讲解如何使用uni-app 和 uniCloud 云开发&#xff0c;实现小案例&#xff0c;不需要后端&#xff0c;来实现全栈开发。 2- 概念 2.1 什么是uni-app uni-app 是一个使用Vue.js开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、…