OpenCV(三十六):霍夫直线检测

1.检测直线的霍夫变换原理

2.检测直线函数HoughLines()

检测直线流程:

Step1:将参数空间的坐标轴离散化。

Step2:将图像中每个非0像素通过映射关系求取在参数空间通过的方格

Step3:统计参数空间内每个方格出现的次数,选取次数大于某一值的方格作为表示直线的方格

Step4:将参数空间中表示直线的方格的参数作为图像中直线的参数

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

)

参数说明:

  • image:输入的二值图像,通常是经过边缘检测后的图像。
  • lines:输出参数,包含检测到的直线的向量。
  • rho:极径参数ρ的精确度,以像素为单位。
  • theta:角度参数θ的精确度,以弧度为单位。
  • threshold:参数空间中投票阈值,用于确定检测到的直线。
  • srn、stn、min_theta、max_theta:这些参数是可选的,用于进一步细化直线检测的精度和范围。

示例代码:

void drawLine(Mat &img,//要标记直线的图像vector<Vec2f> lines,//检测的直线数据double rows,//原图像的行数(高)double cols,//原图像的列数(宽)Scalar scalar,//绘制直线的颜色int n//绘制直线的线宽){Point pt1,pt2;for(size_t i=0;i<lines.size();i++){float rho=lines[i][0];//直线距离坐标原点的距离float theta=lines[i][1];//直线过坐标原点垂线double a=cos(theta);//夹角的余弦值double b=sin(theta);//夹角的正弦值double x0=a*rho,y0=b*rho;//直线与坐标原点的垂线的交点double length=max(rows,cols);//图像高宽的最大值//计算直线上的一点pt1.x= cvRound(x0+length*(-b));pt1.y= cvRound(y0+length*(a));//计算直线上的另一点pt2.x= cvRound(x0-length*(-b));pt2.y= cvRound(y0-length*(a));//两点绘制一条直线line(img,pt1,pt2,scalar,n);}
}
//霍夫直线检测
void Hough_linear_detection(Mat image){Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);Mat edge;//检测边缘图像,并二值化Canny(gray,edge,80,180,3, false);//用不同的累加器进行检测直线vector<Vec2f> lines1,lines2;HoughLines(edge, lines1,1,CV_PI/180,50,0,0);HoughLines(edge, lines2,1,CV_PI/180,150,0,0);//在原图像中绘制直线Mat img1,img2;image.copyTo(img1);image.copyTo(img2);drawLine(img1,lines1,edge.rows,edge.cols,Scalar(255),2);drawLine(img2,lines2,edge.rows,edge.cols,Scalar(255),2);//显示图像imwrite("/sdcard/DCIM/edge.png",edge);imwrite("/sdcard/DCIM/img1.png",img1);imwrite("/sdcard/DCIM/img2.png",img2);
}

Canny算子边缘检测后图片 :

用累加器为50进行检测直线:

用累加器为150进行检测直线:

3.检测直线函数 HoughLinesP()

void cv::HoughLinesP ( InputArray   image,

OutputArray lines,

double     rho,

double    theta,

int        threshold,

double   minLineLength =0,

double   maxLineGap = 0

)

  • image:待检测直线的原图像,必须是CV_8C的单通道二值图像
  • lines:霍夫变换检测到的直线输出量,每一条直线都由4个参数进行描述,分别是直线两个端点的坐标
  • rho:以像素为单位的距离分辨率。
  • theta: 以弧度为单位的角度分辨率
  • threshold:累加器的阈值
  • minLineLength: 直线的最小长度,当检测直线的长度小于该数值时将会被剔除
  • maxLineGap:允许将同一行两个点连接起来的最大距离。

示例代码:

//霍夫直线检测
void Hough_linearP_detection(Mat image){Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);Mat edge;//检测边缘图像,并二值化Canny(gray,edge,80,180,3, false);//利用渐进概率式霍夫变换提取直线vector<Vec4i> linesP1,linesP2;HoughLinesP(edge, linesP1,1,CV_PI/180,150,30,10);//两个点连接最大距离10HoughLinesP(edge, linesP2,1,CV_PI/180,150,30,30);//两个点连接最大距离30//绘制两个点连接最大距离10直线检测结果Mat img1;image.copyTo(img1);for(size_t i=0;i<linesP1.size();i++){line(img1,Point(linesP1[i][0],linesP1[i][1]),Point(linesP1[i][2],linesP1[i][3]),Scalar(255),3);}//绘制两个点连接最大距离30直线检测结果Mat img2;image.copyTo(img2);for(size_t i=0;i<linesP2.size();i++){line(img2,Point(linesP2[i][0],linesP2[i][1]),Point(linesP2[i][2],linesP2[i][3]),Scalar(255),3);}//显示图像imwrite("/sdcard/DCIM/img10.png",img1);imwrite("/sdcard/DCIM/img20.png",img2);
}

绘制两个点连接最大距离10直线检测结果:

绘制两个点连接最大距离30直线检测结果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prompt Tuning训练过程

目录 0. 入门 0.1. NLP发展的四个阶段&#xff1a; Prompt工程如此强大&#xff0c;我们还需要模型训练吗&#xff1f; - 知乎 Prompt learning系列之prompt engineering(二) 离散型prompt自动构建 Prompt learning系列之训练策略篇 - 知乎 ptuning v2 的 chatglm垂直领域训练记…

如何剪辑视频?方法来了,零基础也能学会!

“视频怎么剪辑呀&#xff0c;刚刚用录屏软件录制了一段视频&#xff0c;但是录进去了很多不需要的画面&#xff0c;需要进行修改&#xff0c;可是不知道视频怎么剪辑&#xff0c;有没有人知道剪辑视频的方法&#xff0c;推荐一下。” 剪辑视频是一门重要的技能&#xff0c;无…

DAY03_瑞吉外卖——公共字段自动填充新增分类分类信息分页查询删除分类修改分类

目录 1. 公共字段自动填充1.1 问题分析1.2 基本功能实现1.2.1 思路分析1.2.2 代码实现1.2.3 功能测试 1.3 功能完善1.3.1 思路分析1.3.2 ThreadLocal1.3.3 操作步骤1.3.4 代码实现1.3.5 功能测试 2. 新增分类2.1 需求分析2.2 数据模型2.3 前端页面分析2.4 代码实现2.5 功能测试…

为什么5G 要分离 CU 和DU?(4G分离RRU 和BBU)

在 Blog 一文中&#xff0c;5G--BBU RRU 如何演化到 CU DU&#xff1f;_5g rru_qq_38480311的博客-CSDN博客 解释了4G的RRU BBU 以及 5G CU DU AAU&#xff0c;主要是讲了它们分别是什么。但是没有讲清楚 为什么&#xff0c;此篇主要回答why。 4G 为什么分离基站为 RRU 和 BBU…

三维模型3DTile格式轻量化压缩模型变形浅析

三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中&#xff0c;常常会出现模型变形的现象。这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素。以下将对此现象进行详细分析。 首先&#xff0c;我们需要了解三维模型轻量化压缩的…

无需编程经验,也能制作租车预约微信小程序,快速上手

现在&#xff0c;制作租车预约微信小程序不再需要编程经验&#xff0c;只需几个简单的步骤&#xff0c;您就可以拥有自己的租车预约微信小程序。在本文中&#xff0c;我们将介绍如何利用乔拓云网后台来制作租车预约微信小程序&#xff0c;并实现您所需的功能。 首先&#xff0c…

postgresql|数据库|数据迁移神器ora2pg的安装部署和初步使用

前言&#xff1a; 有的时候有需求需要迁移Oracle数据库的数据到postgresql&#xff0c;那么&#xff0c;其实可供选择的工具是比较多的&#xff0c;但从迁移效率&#xff0c;准确度这些角度来选择的话&#xff0c;无疑还是GitHub上的开源免费工具ora2pg比较合适的。 ora2pg主…

Python之线程(二)

一、线程同步和互斥锁 同一个资源,多人想用?排队啊! 现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题。 比如:教室里,只有一台电脑,多个人都想使用。天然的解决办法就是,在电脑旁边,大家排队。前一人使用完后,后一人再使用。再比如,上厕所排队。 二、线…

SpringBoot 基于 MongoTemplate 的工具类

一、 什么是MongoDB MongoDB基于分布式文件存储的数据库。由C语言编写。MongoDB是一个高性能&#xff0c;开源&#xff0c;无模式的文档型数据库&#xff0c;是当前NoSql数据库中比较热门的一种。 他支持的数据结构非常松散&#xff0c;是类似json的bjson格式&#xff0c;因此…

Linux 下静态库与动态库的制作与使用

Linux 下静态库与动态库的制作与使用 文章目录 Linux 下静态库与动态库的制作与使用示例代码&#xff1a;静态库静态库制作静态库使用 动态库动态库制作动态库使用 示例代码&#xff1a; test.c test.h main.c 静态库 静态库制作 以示例代码为例&#xff0c;先执行下面…

使用Python编写高效程序

在当今竞争激烈的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;成为了各类网站提升曝光度和流量的关键策略。而要在SEO领域中脱颖而出&#xff0c;掌握高效的网络抓取程序编写技巧是至关重要的。本文将分享一些宝贵的知识和技巧&#xff0c;帮助你使用Python…

c++ 学习之类型,常量以及变量的重点知识

const 和 volatile 组合考点 const int ( * ) 等价于 int const ( * ) const int x 1 ; 说明 x 是常量&#xff0c;无法修改 如何区分指针常量和常量指针 指针常量 为 先有指针后有常量 故为 形式如 &#xff1a; int * const p & x ; 且const 修饰的是 p &#xff0c…

集成学习-树模型

可以分为三部分学习树模型&#xff1a; 基本树&#xff08;包括 ID3、C4.5、CART&#xff09;.Random Forest、Adaboost、GBDTXgboost 和 LightGBM。 基本树 选择特征的准则 ID3&#xff1a;信息增益max C4.5&#xff1a;信息增益比max CART&#xff1a;基尼指数min 优缺…

Linux入门教程||Linux系统目录结构

登录系统后&#xff0c;在当前命令窗口下输入命令&#xff1a; ls / 你会看到如下图所示: 树状目录结构&#xff1a; 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin是Binary的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动Linux时…

【Linux】让笔记本发挥余热,Ubuntu20.04设置WiFi热点

Ubuntu20.04设置WiFi热点 由于卧室距离客厅较远&#xff0c;wifi信号太弱&#xff0c;体验极差。鉴于卧室的笔记本电脑是通过网线连接的客厅路由器&#xff0c;因此考虑将这台老破笔记本作为“路由器”&#xff0c;以便发挥它的余热。实验证明&#xff0c;上网速度提升数十倍&a…

选择排序——直接选择排序

直接选择排序&#xff1a;&#xff08;以重复选择的思想为基础进行排序&#xff09; 1、简述 顾名思义就是选出一个数&#xff0c;再去抉择放哪里去。 设记录R1&#xff0c;R2…&#xff0c;Rn&#xff0c;对i1&#xff0c;2&#xff0c;…&#xff0c;n-1&#xff0c;重复下…

【每日一题】1041. 困于环中的机器人

1041. 困于环中的机器人 - 力扣&#xff08;LeetCode&#xff09; 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。南方向 是y轴的负方向。东方向 是x轴的正方向。西方向 是x轴的负方向。 机器人可以接受下列三条指令之…

C语言实现扫雷小游戏

1.首先扫雷游戏要存储布置好的雷信息&#xff0c;需要一个二维数组 不是雷放* 雷&#xff1a;# 不是雷&#xff1a;0 雷&#xff1a;1 2. 给2个二维数组 9*9 一个存放雷的信息&#xff0c;一个存放布置好雷的信息 3.为了防止在统计坐标周围的…

UDP协议

目录 一、UDP协议端格式 二、UDP的特点 一、UDP协议端格式 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度&#xff1b;如果校验和出错&#xff0c;就会直接丢弃 二、UDP的特点 UDP相对于TCP来说是相对简单的&#xff0c;但是在传输…

Java 日志系列(三):日志使用示例及常见报错

承接前面两篇文章&#xff08;《Java 日志系列一》和 《Java 日志系列二》&#xff09;&#xff0c;本文将介绍几种主流日志框架的使用示例和常见的报错。为了便于读者理解&#xff0c;文中的报错案例力求信息完整&#xff0c;并给出了测试代码&#xff0c;感兴趣的读者&#x…