当前位置: 首页 > news >正文

OpenCV之霍夫变换检测直线

霍夫变换

        首先是笛卡尔坐标系到霍夫空间的转换,比如笛卡尔坐标系中有一条直线 y=ax+b。

 笛卡尔坐标系中一条直线,对应霍夫空间的一个点。
反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点)
原理其实很简单
比如
(1)笛卡尔坐标系内y=ax+b 一条直线确定时 它的斜率和截距是确定的 即是a b是确定的,因此到了霍夫空间内就对应一个(a,b) 即是笛卡尔中一条直线对应霍夫空间一个点
(2)笛卡尔坐标系内一个点 比如x1,y1 相当于x1 y1是确定的 在霍夫空间中
b=-xa+y 即是 b=-x1a+y1 代表的是一条直线 即是笛卡尔中一个点对应霍夫空间一条直线
(3)笛卡尔坐标系多个点

 这些点如果共线 就相当于回到了(1) 笛卡尔坐标系中一条直线对应霍夫空间一个点
(4)笛卡尔坐标系多个点 不共线

 (5)但是 如果直线斜率不存在的时候 霍夫空间那就不容易表示
因此我们换成极坐标 一样的转换原理
先求极坐标方程 其中参数从斜率a和截距b变成 极径p和极角θ

比如下面的变换对比

 

具体计算过程举例:

 

 OpenCV C++实现

/*
*参数说明:
*src:待检测的原图像
*rho:以像素为单位的距离分辨率,即距离r离散时的单位长度
*theat:以角度为单位的距离分辨率,即角度Θ离散时的单位长度(取值的步长)
*Threshold:累加器阈值,参数空间中离散化后每个方格被通过的累计次数大于该阈值,则该方格代表的直线被视为在原图像中存在
*lines:检测到的直线极坐标描述的系数数组,每条直线由两个参数表示,分别为直线到原点的距离r和原点到直线的垂线与x轴的夹角
*/
void myHoughLines(Mat src, double rho, double theat, int Threshold, vector<Vec2f>& lines)
{if (src.empty() || rho < 0.1 || theat>360 || theat < 0)return;int row = src.rows;int col = src.cols;Mat gray;if (src.channels() > 1){cvtColor(src, gray, COLOR_BGR2GRAY);}elsesrc.copyTo(gray);int maxDistance = sqrt(src.cols * src.cols + src.rows * src.rows); // 图像任意两点最大距离int houghMat_cols = 360 / theat;        // theat是角度取值的步长  霍夫变换后距离夹角坐标下对应的Mat的宽(一共多少个θ)int houghMat_rows = maxDistance / rho;  // 霍夫坐标距离夹角下对应的Mat的高 就是p的取值个数 Mat houghMat = Mat::zeros(houghMat_rows, houghMat_cols, CV_32FC1); // 存储p和 θ的矩阵//边缘检测Canny(gray, gray, 100, 200, 3);//二值化threshold(gray, gray, 160, 255, THRESH_BINARY);//遍历二值化后的图像for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (gray.ptr<uchar>(i)[j] != 0){/*从0到360度遍历角度,得到一组关于距离夹角的离散点,即得到一组关于经过当前点(i,j)按单位角度theat旋转得到的直线*/for (int k = 0; k < 360 / theat; k += theat){// k * CV_PI / 180   是极角 θ double r = i * sin(k * CV_PI / 180) + j * cos(k * CV_PI / 180);// 找哪个(θ,r)  最多 if (r >= 0){   // 直线到原点的距离必须大于0 获得在霍夫变换距离夹角坐标系下对应的Mat的行的下标int r_subscript = r / rho;// 经过该直线的点数加1houghMat.at<float>(r_subscript, k) = houghMat.at<float>(r_subscript, k) + 1;}}}}}/*现在 houghMat 矩阵里面的数值N  是经过这点的线个数(极坐标下)比如说 (行,列)对应 (p, θ)  对应的值就是 经过(p, θ)的线一共N条经过直线的点数N 大于阈值, 则视为在原图中存在该直线  就要这条直线了 */for (int i = 0; i < houghMat_rows; i++){for (int j = 0; j < houghMat_cols; j++){if (houghMat.ptr<float>(i)[j] > Threshold){// line保存直线到原点的距离和直线到坐标原点的垂线和x轴的夹角 求p和θVec2f line(i * rho, j * theat * CV_PI / 180);lines.push_back(line);}}}}

相关文章:

OpenCV之霍夫变换检测直线

霍夫变换 首先是笛卡尔坐标系到霍夫空间的转换&#xff0c;比如笛卡尔坐标系中有一条直线 yaxb。 笛卡尔坐标系中一条直线&#xff0c;对应霍夫空间的一个点。 反过来同样成立&#xff08;霍夫空间的一条直线&#xff0c;对应笛卡尔坐标系的一个点&#xff09; 原理其实很简单 …...

lv3 嵌入式开发-11 Linux下GDB调试工具

目录 1 GDB简介 2 GDB基本命令 3 GDB调试程序 1 GDB简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说&#xff0c;GDB主要帮助你完成下面四个方面的功能&#xff1a; 1、启动你的程序&#xff0c;可以按照你的自定义的要求随心所欲的运行程序&#…...

Zabbix监控平台概念

1.概念 Zabbix是一款开源的、免费的、分布式监控平台支持web管理&#xff0c;WEB界面可以方便管理员使用可以监控硬件服务器CPU温度、风扇转速、操作系统CPU、EME、DISK、I/O、流量宽带、负载、端口、进程等Zabbix是C/S架构&#xff0c;Client客户端和Server端组成 2.Zabbix可…...

【javaSE】 枚举与枚举的使用

文章目录 &#x1f384;枚举的背景及定义⚾枚举特性总结&#xff1a; &#x1f332;枚举的使用&#x1f6a9;switch语句&#x1f6a9;常用方法&#x1f4cc;示例一&#x1f4cc;示例二 &#x1f38d;枚举优点缺点&#x1f334;枚举和反射&#x1f6a9;枚举是否可以通过反射&…...

NetSuite知识会汇编-管理员篇顾问篇2023

本月初&#xff0c;开学之际&#xff0c;我们发布了《NetSuite知识会汇编-用户篇 2023》&#xff0c;这次发布《NetSuite知识会汇编-管理员篇&顾问篇2023》。本篇挑选了近两年NetSuite知识会中的一些文章&#xff0c;涉及开发、权限、系统管理等较深的内容&#xff0c;共19…...

根号分治与多项式的巧妙结合:GYM-104386G

使用范围&#xff1a;序列上对于每种数的计数问题 考虑对每种数的出现次数进行根号分治 如果出现次数很少&#xff0c;直接平方暴力即可 如果很大考虑任意 ( i , j ) (i,j) (i,j)&#xff0c;我们拆一下&#xff0c;再移一下&#xff0c;然后就变成了卷积形式...

通过FTP高速下载几百G数据

基因组下载 (FTP) 常见问题解答 基因组FTP站点有哪些亮点?下载多个基因组组装数据的最简单方法是什么?下载大型数据集的最佳协议是什么?为什么 NCBI 基因组 FTP 站点要重组?我如何及时了解 NCBI 基因组 FTP 站点的变化?...

cudnn-windows-x86_64-8.6.0.163_cuda11-archive 下载

网址不太好访问的话,请从下面我提供的分享下载 Download cuDNN v8.6.0 (October 3rd, 2022), for CUDA 11.x 此资源适配 cuda11.x 将bin和include文件夹里的文件&#xff0c;分别复制到C盘安装CUDA目录的对应文件夹里 安装cuda时自动设置了 CUDA_PATH_V11_8 及path C:\Progra…...

多线程案例(1) - 单例模式

目录 单例模式 饿汉模式 懒汉模式 前言 多线程中有许多非常经典的设计模式&#xff08;这就类似于围棋的棋谱&#xff09;&#xff0c;这是用来解决我们在开发中遇到很多 "经典场景"&#xff0c;简单来说&#xff0c;设计模式就是一份模板&#xff0c;可以套用。…...

Arduino驱动TCS34725传感器(颜色传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 TCS34725是一款低成本,高性价比的RGB全彩颜色识别传感器,传感器通过光学感应来识别物体的表面颜色。...

知识库网站如何搭建?需要注意这五个要点!

正因为知识库提供结构化知识库来记载信息和知识&#xff0c;便于团队沉淀经验、共享资源&#xff0c;形成完整的知识体系并持续进化​&#xff0c;使得它成为当前企业发展新宠。 构建自己/团队的知识库是一个良好的习惯&#xff0c;可以提高工作和学习效率&#xff0c;以下是一…...

【UE虚幻引擎】UE源码版编译、Andorid配置、打包

首先是要下载源码版的UE&#xff0c;我这里下载的是5.2.1 首先要安装Git 在你准备放代码的文件夹下右键点击Git Bash Here 然后可以直接git clone https://github.com/EpicGames/UnrealEngine 不行的话可以直接去官方的Github上下载Zip压缩包后解压 运行里面的Setup.bat&a…...

树和二叉树的相关概念及结构

目录 1.树的概念及结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.3.1 孩子兄弟表示法 1.3.2 双亲表示法 1.4 树的实际应用 2.二叉树的概念及结构 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储 2.4.1 顺序存储 2.4.2 链式存储 1.树…...

MySQL安装validate_password_policy插件

功能介绍 validate_password_policy 是插件用于验证密码强度的策略。该参数可以设定三种级别&#xff1a;0代表低&#xff0c;1代表中&#xff0c;2代表高。 validate_password_policy 主要影响密码的强度检查级别&#xff1a; 0/LOW&#xff1a;只检查密码长度。 1/MEDIUM&am…...

数据在内存中的存储——练习3

题目&#xff1a; 3.1 #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }3.2 #include <stdio.h> int main() {char a 128;printf("%u\n",a);return 0; }思路分析&#xff1a; 首先二者极其相似%u是无符号格式进行…...

web-案例

分页插件 登录 事务...

第一章 JAVA入门

文章目录 1.2 Java 的特点1.2.1 简单1.2.2 面向对象1.2.3 与平台无关① 平台与机器指令② C/C程序依赖平台③ Java 虚拟机与字节码1.2.4 多线程1.2.5 动态1.30安装 JDK1.3.1 平台简介0 Java SE②Java EE1.4 Java 程序的开发步骤②保存源文件1.5.2 编译1.8 Java之父-James Gosli…...

二叉树详解(求二叉树的结点个数、深度、第k层的个数、遍历等)

二叉树&#xff0c;是一种特殊的树&#xff0c;特点是树的度小于等于2&#xff08;树的度是整个树的结点的度的最大值&#xff09;&#xff0c;由于该特性&#xff0c;构建二叉树的结点只有三个成员&#xff0c;结点的值和指向结点左、右子树的指针。 typedef int DateType; t…...

Apollo配置中心及Python连接

本文将会介绍如何启动Apollo&#xff0c;在Apollo中配置参数&#xff0c;以及如何使用Python连接Apollo. Apollo介绍 在文章Python之读取配置文件和文章Python之配置文件处理中&#xff0c;笔者分别介绍了如何使用Python来处理ini, yaml, conf等配置文件。这种配置方式比较方便…...

LuatOS-SOC接口文档(air780E)--audio - 多媒体音频

常量 常量 类型 解释 audio.PCM number PCM格式&#xff0c;即原始ADC数据 audio.MORE_DATA number audio.on回调函数传入参数的值&#xff0c;表示底层播放完一段数据&#xff0c;可以传入更多数据 audio.DONE number audio.on回调函数传入参数的值&#xff0c;表示…...

Golang gorm manytomany 多对多 更新、删除、替换

Delete 移除 只删除中间表的数据 删除原有的 var a Article1db.Preload("Tag1s").Take(&a, 1)fmt.Printf("%v", a) {1 k8s [{1 cloud []} {2 linux []}]}mysql> select * from article1; ------------ | id | title | ------------ | 1 | k8s …...

FPGA-结合协议时序实现UART收发器(四):串口驱动模块uart_drive、例化uart_rx、uart_tx

FPGA-结合协议时序实现UART收发器&#xff08;四&#xff09;&#xff1a;串口驱动模块uart_drive、例化uart_rx、uart_tx 串口驱动模块uart_drive、例化uart_rx、uart_tx&#xff0c;功能实现 文章目录 FPGA-结合协议时序实现UART收发器&#xff08;四&#xff09;&#xff1…...

Transformers-Bert家族系列算法汇总

&#x1f917; Transformers 提供 API 和工具&#xff0c;可轻松下载和训练最先进的预训练模型。使用预训练模型可以降低计算成本、碳足迹&#xff0c;并节省从头开始训练模型所需的时间和资源。这些模型支持不同形式的常见任务&#xff0c;例如&#xff1a; &#x1f4dd; 自…...

Vulnhub系列靶机---HarryPotter-Fawkes-哈利波特系列靶机-3

文章目录 信息收集主机发现端口扫描dirsearch扫描gobuster扫描 漏洞利用缓冲区溢出edb-debugger工具msf-pattern工具 docker容器内提权tcpdump流量分析容器外- sudo漏洞提权 靶机文档&#xff1a;HarryPotter: Fawkes 下载地址&#xff1a;Download (Mirror) 难易程度&#xff…...

【服务器】ASUS ESC4000-E11 安装系统

ASUS ESC4000-E11说明书 没找到 ASUS ESC4000-E11的说明书&#xff0c;下面是ESC4000A-E11的说明书&#xff1a; https://manualzz.com/doc/65032674/asus-esc4000a-e11-servers-and-workstation-user-manual 下载地址&#xff1a; https://www.manualslib.com/manual/231379…...

创建java文件 自动添加作者、时间等信息 – IDEA 技巧

2023 09 亲测 文章目录 效果修改位置配置信息 效果 每次创建文件的时候&#xff0c;自动加上作者、时间等信息 修改位置 打开&#xff1a;File —> Settings —> Editor —> File and Code Templates —> includes —> FileHeader 配置信息 /*** author : Java…...

第27章_瑞萨MCU零基础入门系列教程之freeRTOS实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

Java学习之--类和对象

&#x1f495;粗缯大布裹生涯&#xff0c;腹有诗书气自华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java学习之--类和对象 类和对象 类的实例化&#xff1a; 1.什么叫做类的实例化 利用类创建一个具体的对象就叫做类的实例化&#xff01; 当我们创建了…...

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…...

破天荒呀!小杜微信有名额了

写在前面 小杜粉&#xff0c;众所周知前面加小杜微信为好友的基本都是由名额限制的。一般都是付费进入社群且进行备注&#xff0c;小杜才会长期保留微信好友。主要由于&#xff0c;添加的人数太多了&#xff0c;微信账号人数名额有限。因此&#xff0c;小杜过一段时间&#xf…...

网站建设的好处有什么用/引擎seo如何优化

系统流程如下图所示 首先数据交换流程为数据库<—>后台<---->前台 Dao层负责和数据库进行数据交互&#xff0c;services负责事务逻辑处理,action为struts部分&#xff0c;主要负责页面跳转时的数据传送。在web.xml文件中&#xff0c;有 <?xml version"1…...

有免费做理化试验的网站吗/百度推广视频

为什么80%的码农都做不了架构师&#xff1f;>>> 关于UITableView的contentInset属性 1.关于滚动视图contentSize、contentOffset、contentInset 的整理 contentSize 是scrollview可以滚动的区域&#xff0c;比如frame (0 ,0 ,320 ,480) contentSize (320 ,960)&…...

澳门网站建设运营app/yandex搜索引擎

count是一种最简单的聚合函数&#xff0c;一般也是我们第一个开始学习的聚合函数.很多人认为count(1)执行的效率会比count()高&#xff0c;原因是count()会存在全表扫描&#xff0c;而count(1)可以针对一个字段进行查询。其实不然&#xff0c;count(1)和count(*)都会对全表进行…...

金华网站建设团队/虎扑体育网体育

获取【下载地址】QQ: 313596790官网 http://www.fhadmin.org/A代码编辑器&#xff0c;在线模版编辑&#xff0c;仿开发工具编辑器&#xff0c;pdf在线预览&#xff0c;文件转换编码B 集成代码生成器[正反双向](单表、主表、明细表、树形表&#xff0c;快速开发利器)快速表单构建…...

做招聘的网站/贵港seo关键词整站优化

标签&#xff1a;Navicat for MySQL 常规选项Navicat 常规选项主要包括以下内容&#xff1a;窗口在工作列显示&#xff1a;每打开一个新窗口时会自动显示在 Windows 任务栏。停用该选项后&#xff0c;当退出 Navicat 主窗口时&#xff0c;所有窗口(例如&#xff1a;表、查询)将…...

上海网站设计工作室/培训心得体会

也许你曾遇到过这样的情况运行类似的代码StreamReader srnewStreamReader("Test.txt");运行时会提示&#xff1a;"Could not find file C:"windows"system32"Test.txt".这就是路径不对造成的幸好在asp.net的request对象中有许多与路径相关的…...